我在C ++中遇到了一个奇怪的问题。可能我只是做错了什么,但我无法弄明白,是什么。如果这很重要,我正在使用Microsoft VS2013。
我创建了一个包含两个构造函数的新类:
class CtVolume{
public:
CtVolume();
CtVolume(std::string path);
...
第一个应该覆盖默认构造函数。这是一个不能按我的预期工作的。如果我这样做:
CtVolume myVolume();
然后我认为这应该调用我定义的默认构造函数并执行我为它实现的代码。但事实并非如此。我的构造函数中的代码未执行。更令人费解的是,我之后不能像对象一样使用myVolume
。如果我尝试调用该类中实现的方法之一:
myVolume.reconstructVolume();
编译器不允许我编译我的代码。它说:
错误5错误C2228:'.reconstructVolume'的左边必须有class / struct / union
看来,这样我无法创建对象。
现在,如果我用关键字'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)
意味着什么,我做错了什么?
让我感到困惑的是,我认为我之前做了很多次,直到现在它一直对我有效。
谢谢!
答案 0 :(得分:4)
该行:
CtVolume myVolume();
编译器将解释为函数声明。看看most vexing parse。
只是做:
CtVolume myVolume;
上面的代码将适当地调用默认构造函数。