0

我在C++中有一個奇怪的問題。也許我只是在做錯事,但我無法弄清楚,什麼。如果這很重要,我正在使用微軟VS2013。C++ VS2013:覆蓋默認構造函數不起作用

我創建了一個新的類有兩個構造函數:

class CtVolume{ 
public:  
    CtVolume();            
    CtVolume(std::string path);        
... 

第一個應該覆蓋默認構造函數。這是不符合我預期的工作。如果我這樣做:

CtVolume myVolume(); 

那麼我認爲這應該調用默認構造函數,我定義並執行我爲其實現的代碼。但事實並非如此。我的構造函數中的代碼沒有執行。更令人費解的是,我不能像之後的物體一樣使用myVolume。如果我試圖調用類中實現的方法之一:

myVolume.reconstructVolume(); 

編譯器不讓我編譯我的代碼。它說:

錯誤5錯誤C2228:左「.reconstructVolume」必須有類/結構/聯合

所以當它看來,這種方式我不能創建一個對象。

現在,如果我用關鍵字'new'創建對象,我的構造函數代碼正在執行,一切都按預期工作。例如:

CtVolume* myVolume = new CtVolume(); 
myVolume->reconstructVolume(); 

這工作正常。

現在,另一件事:如果我用我定義的其他構造函數,創建對象的工作同樣出色,這意味着這個例子中的兩種方式:

CtVolume myVolume("sourcefiles/data/skullPhantom"); 
myVolume.reconstructVolume(); 

編譯和按預期工作。

現在我試圖找出哪種類型的myVolume是在不同的情況下,通過調用typeid(myVolume).name()。在我描述的情況下,它返回的類型爲class CtVolume __cdecl(void),它在「不起作用」的情況下和class CtVolume在我使用其他構造函數的「工作」情況下。

現在任何人都可以告訴我,__cdecl(void)的含義和我做錯了什麼? 讓我感到困惑的是,我認爲我之前做了很多次,直到現在它一直對我有用。

謝謝!

回答

4

線:

CtVolume myVolume(); 

是由編譯器爲函數聲明解釋。看看most vexing parse

只要做到:

CtVolume myVolume; 

上面的代碼將適當地調用默認的構造函數。

+0

非常感謝,現在正常工作! – user1488118