我在Visual C ++ 2010 Express中遇到了一些代码问题。我试图创建一个具有接受具有默认值的参数的构造函数的类。这是一个简短的程序,展示了我想要实现的目标:
//Class declaration
class Class {
private:
int mValue;
public:
Class(int);
int GetValue();
};
Class::Class(int val=1) : mValue(val)
{
}
int Class::GetValue()
{
return mValue;
}
int main()
{
Class test;
cout << test.GetValue() << endl;
}
现在这似乎工作正常。如果我将Class test
替换为Class test(10)
,请说,mValue
已正确初始化。
但是,在第二个程序中,我试图做同样的事情。我有一个像这样定义的类:
namespace mobs {
Class Monster {
private:
mHitPoints;
public:
Monster(int);
int GetHitPoints() const;
};
}
实现这样的功能:
namespace mobs {
Monster::Monster(int hp=10) : mHitPoints(hp)
{
}
int Monster::GetHitPoints() const
{
return mHitPoints;
}
}
但是当我尝试声明一个类并使用GetHitPoints()
函数时:
mobs::Monster testmonster;
cout << testmonster.GetHitPoints() << endl;
Visual C ++告诉我&#34;类怪物没有默认构造函数:: Monster&#34;。这是为什么?
答案 0 :(得分:5)
默认值属于声明,而不是定义。将=10
移到您的标题文件中:
Monster(int hp = 10)
。
在实现中,您甚至不需要默认值。我通常使用:
Monster::Monster(int hp /*=10*/)
只是为了说明默认值。
答案 1 :(得分:-1)
构造函数是ambigious。这就是为什么。 如果你有两个构造函数
Monster(){}
Monster(x=10){}
然后你打个电话 怪物m();
编译器应该如何知道你是指第一个还是第二个构造函数 而是将其定义如下
class Class {
private:
int mValue;
public:
Class(int val) :mValue(val){}
Class() :mValue(1){}
};