Проблема доступа к базовому члену в производном конструкторе - PullRequest
4 голосов
/ 01 июня 2010

Даны следующие классы:

class Foo
{
    struct BarBC
    {
    protected:
        BarBC(uint32_t aKey)
            : mKey(aKey)
              mOtherKey(0)

    public:
        const uint32_t mKey;
        const uint32_t mOtherKey;
    };


    struct Bar : public BarBC
    {
        Bar(uint32_t aKey, uint32_t aOtherKey)
            : BarBC(aKey),
              mOtherKey(aOtherKey) // Compile error here
    };
};

Я получаю ошибку компиляции в указанной точке:

error: class `Foo::Bar' does not have any field named `mOtherKey'.

Может кто-нибудь объяснить это? Я подозреваю, что это синтаксическая проблема из-за того, что мой класс Bar определен в классе Foo, но, похоже, не могу обойти его.

Это простое публичное наследование, поэтому mOtherKey должен быть доступен из конструктора Bar. Верно? * * 1013

Или это как-то связано с тем, что mOtherKey является константой, и я уже инициализировал его как 0 в конструкторе BarBC?

Ответы [ 2 ]

8 голосов
/ 01 июня 2010

Вы не можете инициализировать членов базового класса через список инициализаторов, только прямые и виртуальные базовые классы и не статические данные-члены самого класса. Вместо этого передайте дополнительные параметры конструктору базового класса:

struct BarBC {
    BarBC(uint32_t aKey, uint32_t otherKey = 0)
      : mKey(aKey), mOtherKey(otherKey)
    {}
    // ...
};

struct Bar : public BarBC {
    Bar(uint32_t aKey, uint32_t aOtherKey)
      : BarBC(aKey, aOtherKey)
    {}
};
1 голос
/ 01 июня 2010

Вы не можете сделать это, так как BarBC создает mOtherKey - вы не можете переопределить его.

Вы можете присвоить новое значение:

Bar(...) : ...
{ mOtherKey=aOtherKey; }

Или создайте дополнительный конструктор BarBC с параметром mOtherKey

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