2017-02-23 40 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; 
} 

令我驚訝的是,它無法編譯。海灣合作委員會和叮噹都給出了錯誤:

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結構,並因此不能在構造函數初始化列表中。

構造函數初始值設定項列表只能初始化直接類或結構成員,而不是基類成員。或者「調用」基類的構造函數。

你應該在Derived初始化列表中添加一個Base構造服用m_i值作爲參數,並使用該構造:

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; 
    } 
}; 
相關問題