2 votes

Modifier une variable membre héritée n'affecte pas la classe de base

J'ai les deux classes suivantes :

class A
{
public:

    A() : value(false) {}

    bool get() const
    {
        return value;
    }

protected:
    bool value;
};

class B : public A
{
public:

    void set()
    {
        value = true;
    }
};

Maintenant je les utilise comme suit :

B* b = new B;
std::shared_ptr a(b);

auto func = std::bind(&B::set, *b);

std::cout << a->get() << std::endl;
func();
std::cout << a->get() << std::endl;

Je m'attends à ce que a->get() retourne true lors du 2ème appel, mais func() n'a pas modifié sa valeur. Pourquoi ?

4voto

rafix07 Points 12046

std::bind prend ses paramètres par valeur, donc vous manipulez une copie de *b.

Vous devez passer l'objet d'origine par std::ref :

auto func = std::bind(&B::set, std::ref(*b));

Démo en direct

Ou une forme plus simple serait simplement de passer un pointeur à bind :

auto func = std::bind(&B::set, b);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X