2012-10-21 149 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在这种情况下,你可以使用括号(它们是可选的),但这是因为它不能被视为一个声明。 –