2012-12-03 60 views
-1

我試圖做多重繼承在C++:繼承和地圖C++

class Element{ 
public: 
    Element(): common_variable(0) {} 
    int common_variable; 
}; 

class Number:public Element, public Setupable{ 
public: 
Number() {} 
    vector<Digit> digit_vector; 
}; 
class MultiLed:public Element, public Setupable{ 
public: 
MultiLed() {} 
    vector<Led> led_vector; 
}; 

對象要素是從來沒有實例化,但我用它來避免MULTILED和數字代碼重複。

有一個地圖,其中包括一個數:map<string,Number> mNumbers,我想它在第一次使用創建:

mNumbers["blabla"].digit_vector.push_back(digit); 

但是,這是行不通的。對Element,Setupable和Number的構造函數的調用已正確完成。但程序停止在「push_back」呼籲說:

undefined symbol: _ZN14AcElementD2Ev 

有人可以幫我這個嗎?

+1

「Setupable」的定義也可能有幫助... – janr

+0

您是否使用GCC進行編譯,並且確切的符號是?它看起來差不多,但不完全像GCC所稱的名爲'AcElement'類的析構函數。你有一個類似這樣的名字的類,你在那個類中聲明瞭一個析構函數嗎? –

+0

@Jav元素中是否有靜態成員D2Ev? – billz

回答

0

由於您沒有發佈所有代碼,我必須猜測代碼中的情況。當您更新問題時,我會更新我的答案。 最有可能的是,您已經在Element中聲明瞭一個靜態成員,名稱很可能是D2Ev,但您忘記提供它的定義。

當您定義基類時,不要忘記聲明虛擬析構函數。

class Element{ 
public: 
    Element():common_variable(0) { 
    } 
    virtual ~Element(){ 
    } 
    int common_variable; 
}; 
0

digit_vector是私人的,你正試圖在課外訪問。

1

你有兩個問題在這裏

  1. 訪問限制:在所有class成員都默認爲私有
  2. 你contructors沒有定義,只是聲明

補丁代碼:

class Element{ 
public: 
    Element(){ 
     common_variable = 0; 
    } 
    int common_variable; 
}; 

class Number:public Element, public Setupable{ 
public: 
Number() {} 
    vector<Digit> digit_vector; 
}; 
class MultiLed:public Element, public Setupable{ 
public: 
MultiLed() {} 
    vector<Led> led_vector; 
}; 
0

只是你忘記設置公共方法和變量

class Number:public Element, public Setupable 
{ 
public: 
    Number(): Element(), Setupable() {} 
    vector<Digit> digit_vector; 
}; 

順便說一下,就吃一個成員變量公衆並不總是好主意, 你應該提供一個方法返回digit_vector

//the method is provided in 2 soups, and there are reson for that 
//even if you can omitt the "const" version, is better you keep both 
const vector<Digit> & getDigits() const { return digit_vector; } 
vector<Digit> & getDigits() { return digit_vector; } 

,或者如果你的類必須是隻是一個「數據容器「讓一個結構

struct Number:public Element, public Setupable 
{ 
    //default construsctors of Element and Setupable are still called! 
    //if not providing a default constructor, the compiler will create one 
    //automatically calling all default constructor (including the vector's 
    //one. Also digit_vector is constructed. 

    vector<Digit> digit_vector; 
}; 

結構是相同的類,唯一不同的是,默認情況下成員全部公開, 和桑尼你不必指定「public:」。一種好的風格是隻使用類(並且你必須記住什麼是公有或私有的),並且只需要使用結構就可以獲得一個幾乎沒有數據容器的邏輯。

所以寫:

class Number:public Element, public Setupable 
{ 
    //default construsctors of Element and Setupable are still called! 
    //if not providing a default constructor, the compiler will create one 
    //automatically calling all default constructor (including the vector's 
    //one. Also digit_vector is constructed. 

public: 
    vector<Digit> digit_vector; 
}; 

有效了。但通常你不想隱式地調用構造函數。

+0

好吧,我糾正了這個小錯誤(事實上,我錯過了代碼,因爲「public:」已經寫好了)。 – Jav

+0

我試過上面的代碼,它編譯得很好(當然使用空的Led和Digit)。如果出現錯誤,則不在您發佈的代碼或您的IDE設置中..查看我編譯的代碼: http://pastebin.com/E5YkV7ME – GameDeveloper

0

我忘了執行析構函數〜元素(){} 現在,它的工作原理...

對不起大家對這個愚蠢的錯誤。

Thx無論如何!