Не удается преобразовать этот указатель - PullRequest
0 голосов
/ 05 февраля 2011

У меня есть класс Foo, который выглядит следующим образом

class Foo
{
public:
    void set_bar(int val)
    {
        _bar = val;
    }

protected:
    int _bar;
};

который наследуется классом Baz, который объявлен следующим образом:

class Baz
    : public Foo
{
public:
    void set_baz(int val)
    {
        _baz = val;
    }

protected:
    int _baz;
};

и затем у меня есть класс Factory, который содержит переменную-член типа Baz.

class Factory
{
protected:
    Baz _baz;
public:
    const Baz& get_baz() const 
    {
        return _baz;
    }
};

Если бы я использовал Factory вот так:

Factory f;
f.get_baz().set_bar(1);

Это бросает это error C2662: 'Foo::set_bar' : cannot convert 'this' pointer from 'const Baz' to 'Foo &'

Ответы [ 4 ]

1 голос
/ 05 февраля 2011

Вам необходимо предоставить неконстантную версию Factory :: get_baz, которая возвращает неконстантную ссылку на Baz:

class Factory
{
protected:
    Baz _baz;
public:
    const Baz& get_baz() const 
    {
        return _baz;
    }

    Baz& get_baz()
    {
        return _baz;
    }
};

При использовании const Factory вызывается const-версия get_baz, в противном случае вызывается неконстантная версия get_baz.

Вы также должны воздерживаться от использования подчеркивания в ваших именах. См. Каковы правила использования подчеркивания в идентификаторе C ++? .

1 голос
/ 05 февраля 2011

Объект, возвращаемый get_baz, является константой, вы не можете изменять его содержимое.

0 голосов
/ 06 февраля 2011

Вы можете изменить значение, только если вернете неконстантную ссылку на ваш объект.

Если вы возвращаете неконстантную ссылку, почему бы просто не сделать ее публичной? Вы получите тот же эффект ...

0 голосов
/ 05 февраля 2011

После вызова get_baz вы получаете постоянный объект, а постоянный объект может вызывать только постоянную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...