2017-02-23 56 views
1

У меня есть простая программа для проверки списка инициализации, как показано ниже:Не удалось скомпилировать список инициализации производного класса на C++, почему?

#include<stdio.h> 
struct Base{ 
    Base():m_i(2){} 
    int m_i; 
}; 
struct Derived:Base{ 
    Derived():m_i(3){} 
}; 
int main() 
{ 
    Derived d; 
    return 0; 
} 

К моему удивлению, он не компилируется. Как gcc, так и clang дают и ошибки:

1.cpp:7:15: error: member initializer 'm_i' does not name a non-static data member or base class 
    Derived():m_i(3){} 
      ^~~~~~ 

Где я ошибался и как это исправить?

+0

Что вы ожидаете значение 'm_i'? 3 или 2? – bejado

ответ

3

Хотя m_i могут быть использованы в Derived структуре, это на самом деле не член из Derived структуры, и поэтому не могут быть использованы в списке конструктор инициализации.

Список инициализаторов конструктора может инициализировать только класс класс или элементы структуры, а не члены базовых классов. Или «вызвать» конструктор базового класса.

Вы должны добавить Base конструктор, принимающий значение m_i в качестве аргумента, и использовать этот конструктор в списке Derived инициализатора:

Derived() : Base(3) {} 
3

Сообщение об ошибке компилятора достаточно ясна.

m_i не является нестационарным членом данных класса и не является базовым классом. Следовательно, он не может быть использован в

Derived():m_i(3){} 

Если вы хотите установить значение m_i в 3, вы можете использовать тело конструктора, чтобы сделать это.

Derived() { m_i = 3; } 
2

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

struct Base{ 
    Base(int i=2):m_i(i){} 
    int m_i; 
}; 
struct Derived:Base{ 
    Derived():Base(3){} 
}; 

Другой просто присвоить переменной вместо его инициализации, например:

struct Derived:Base{ 
    Derived(){ 
     m_i=3; 
    } 
}; 
Смежные вопросы