2017-06-02 63 views
1

我有下面的代碼:十字架初始化錯誤

Class A { 
    public: 
    A::A(const char* name): 
     _name(name) 
     {} 
    virtual void doSomething(); 
    private: 
    const char* _name; 
} 

Class B : public A { 
    B::B(const char* name): 
    A(name) 
    {} 
    void doSomething() { 
    //do something 
    } 
} 

到目前爲止好,但我在下面的代碼遇到一個錯誤crosses initialization of B* newB

std::vector<A*> vectorOfAs; 

switch (enumType) { 
    case enum1 : 
    B* newB = new B("foobar"); 
    vectorOfAs.push_back(newB); 
    break; 
    case enum2 : 
    C* newC = new C("barfoo"); 
    vectorOfAs.push_back(newC); 
    break; 
} 

爲什麼錯誤?

一些背景: 我想將派生類的指針存儲在向量中以方便搜索/迭代。這些名稱是唯一的,所以我可以遍歷向量並查找指向具有正確名稱的對象的指針。從指向對象調用方法時,應該調用繼承的方法(//do something)。

編輯:@FrançoisAndrieux:你是對的。犯(嚴重)錯字。 改變Class B : public BClass B: public A

+3

聽起來就像你有一個'goto'或者不恰當的''swith'聲明。你能提供[mcve]嗎? – NathanOliver

+1

'B類:公共B'好像你想要B類:公共A'? –

+2

@FrançoisAndrieux更不要說在A中doSomething應該被聲明爲純虛函數,並且B中的方法都是私有的。就像Nathan所要求的那樣,正在編譯的實際代碼會很好。 –

回答

0

newB是在switch語句,這使得它在所有開關的情況下可用的範圍,但不會在所有的人都被初始化。你應該在其贏得了當地範圍包圍每一種情況下(見this answer瞭解更多信息):

switch (enumType) { 
    case enum1 : 
    { 
    B* newB = new B("foobar"); 
    vectorOfAs.push_back(newB); 
    break; 
    } 
    case enum2 : 
    { 
    C* newC = new C("barfoo"); 
    vectorOfAs.push_back(newB); 
    break; 
    } 
} 

此時你會得到enum2(由此暴露出一個bug)編譯器錯誤,因爲你是推福利局不newC,這是我以爲你打算:

switch (enumType) { 
    case enum1 : 
    { 
    B* newB = new B("foobar"); 
    vectorOfAs.push_back(newB); 
    break; 
    } 
    case enum2 : 
    { 
    C* newC = new C("barfoo"); 
    vectorOfAs.push_back(newC); // <-- 
    break; 
    } 
} 

這應該工作。

+0

工程!當NathanOliver出現時,我肯定會不得不提供更多信息給以前的助手! – BMelis