установить постоянное значение члена из подкласса - PullRequest
1 голос
/ 03 апреля 2012

Код:

struct A{
    const bool const_some_write_once_flag;
    A(): const_some_write_once_flag(false) { }
};
struct B: public A{
    B(): const_some_write_once_flag(true) { }
};

ошибка: у класса 'B' нет поля с именем 'const_some_write_once_flag'.Я полагаю, это потому, что, будучи в конструкторе B, создаваемый объект еще не имеет тип A, потому что «унаследованный фрагмент» A еще не был инициализирован.

Я попытался несколько обходных путей без удачи, и я опущу их здесь.Есть ли способ добиться того, что я пытаюсь сделать?

Ответы [ 2 ]

6 голосов
/ 03 апреля 2012

В своем списке инициализаторов B может инициализировать только свои собственные элементы данных, свои прямые базовые классы и любые виртуальные базовые классы.const_some_write_once_flag не является ни одним из них;это элемент данных A.Он может быть инициализирован только конструктором A.

struct A{
    const bool const_some_write_once_flag;
    A(): const_some_write_once_flag(false) { }

protected:
    A(bool flag) : const_some_write_once_flag(flag) { }
};
struct B: public A{
    B(): A(true) { }
};
0 голосов
/ 03 апреля 2012

Следующее достигает почти того, что вы пытаетесь сделать. Он создает защищенный член A, который может использовать любой другой класс, который хочет наследовать от A. Вы можете быть еще более защитным и сделать B другом A, а затем сделать конструктор, принимающий параметр private.

class A{
    public:
        const bool const_some_write_once_flag;
        A(): const_some_write_once_flag(false) { }
    protected:
        A( const bool initialValue ): const_some_write_once_flag( initialValue ) {}
};

class B: public A{
    public:
        B(): A(true) { }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...