Почему я не могу установить переменную-член класса интерфейса следующим образом - PullRequest
2 голосов
/ 25 февраля 2010

Итак, у меня есть класс интерфейса

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
}

и класс, который наследуется от него. Почему я не могу установить переменную-член класса интерфейса следующим образом.

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): m_interfaceVar(getInt){};
   ~inheritedClass(){};
}

и я должен сделать это так

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt){ m_interfaceVar = getInt;}
   ~inheritedClass(){};
}

Извините, если это глупый вопрос, но я просто наткнулся на него как-то вечером, когда переключал свой абстрактный класс в интерфейсный класс (обратно в абстрактный класс).

Ответы [ 3 ]

6 голосов
/ 25 февраля 2010

Список инициализаторов в конструкторе может указывать ctor для базовых классов в первую очередь. Лишая interfaceClass (защищенного) конструктора (который, очевидно, должен иметь), вы обрезали этот путь жизни.

Итак, добавьте этот защищенный ctor, например ::100100

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
    interfaceClass(int x) { m_interfaceVar=x; }
}

и тогда вы можете делать все правильно, а именно

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): interfaceClass(getInt){};
   ~inheritedClass(){};
}
6 голосов
/ 25 февраля 2010

К тому времени, когда inheritedClass попадает в список инициализаторов, m_interfaceVar уже инициализирован. Вы не можете инициализировать его во второй раз.

Вы можете указать конструктор для interfaceClass, который инициализирует m_interfaceVar, или просто назначить его в теле inheritedClass s конструктора:

 interfaceClass(int getInt) : interfaceVar(getInt){}
 ...
 inheritedClass(int getInt) : interfaceClass(getInt)
 {
 }

или

 inheritedClass(int getInt)
 {
    m_interfaceVar = getInt;
 }
0 голосов
/ 25 февраля 2010

Попробуй так:

class interfaceClass
{
public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    // Ctor - called from derived classes
    interfaceClass(int interfaceVar)
        : m_interfaceVar(interfaceVar){};

    int m_interfaceVar;
}

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt)
       : interfaceClass(getInt){}; // Pass to base class ctor

   ~inheritedClass(){};
}

... на самом деле, если вы не создаете защищенный или приватный конструктор для interfaceClass, компилятор автоматически создаст его для вас, и пользователи смогут создавать экземпляры вашего интерфейс (вы хотели, чтобы это был абстрактный базовый класс, верно?)

...