2012-10-21 153 views
1

在我的頭文件:方法無法解析

Esame(); 
Esame(string); 
Esame(string, Voto); 

這是一個C++類測試儀:

//OK 
Esame esame("Algoritmi e strutture dati", 30); 
esame.stampaEsame(); 

//OK 
Esame esame2("Metodi Avanzati di Programmazione"); 
esame2.setVoto(26); 
esame2.stampaEsame(); 

//ERROR 
Esame esame3(); 
esame3.setVoto(26); //Method could not be resolved 
esame3.stampaEsame(); //Method could not be resolved 

的代碼不會編譯的。爲什麼在上面的代碼中使用相同的類創建對象時找不到方法?

回答

2

esame3()一點兒也不調用默認的構造函數。在你的情況,編譯器認爲你已經聲明瞭一個方法

應該

Esame esame3;

OR

Esame esame3=Esame();

使用new創建一個對象會創建一個動態分配的對象..

在這種情況下,你的類必須是一個pointer這樣

Esame *esame3=new Esame;

你將不得不使用->,而不是.訪問成員方法或變量..

esame3->method1(); 
esame3->varable1; 
+0

你的第二個例子'Esame esame3 = Esame()'與你的第一句話意思矛盾。 –

+0

@LuchianGrigore希望你現在正確! – Anirudha

+0

你在說''Esame()'不會調用默認構造函數「,但它確實(在你發佈的例子中)。 –

1

Esame esame3();是一個函數聲明。在這種情況下,esame3不會命名對象。它聲明瞭一個名爲esame3的函數,該函數不接受參數並返回類型爲Esame的對象。

這被稱爲most vexing parse

創建使用默認的構造函數的對象,請使用Esame esame3;(無括號):

Esame esame3; 
esame3.setVoto(26); 
esame3.stampaEsame(); 
+0

大, 有效。只是另一個相關的問題:如果我想使用new關鍵字創建Esame類的對象,該怎麼辦? – Hoconosc

+0

@Hoconosc在這種情況下,你可以使用括號(它們是可選的),但這是因爲它不能被視爲一個聲明。 –