2012-07-08 134 views
2

我在Visual C++ 2010 Express中遇到了一些代码问题。我试图让一个具有接受具有默认值的参数的构造函数的类。下面是一个简短的程序,显示了我想实现的目标:未找到C++默认构造函数

//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(10)代替Class test,比如说,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++告诉我“没有默认构造函数存在类怪物::怪物”。为什么是这样?

+1

http://stackoverflow.com/questions/1440222/constructors-with-default-parameters-in -header-files – Mat 2012-07-08 19:57:13

回答

4

默认值属于声明中,而不是定义。将=10移动到您的头文件中:

Monster(int hp = 10)

在实现中,您甚至不需要默认值。我通常使用:

Monster::Monster(int hp /*=10*/)

只是要清楚有一个默认值。

+0

非常好,非常感谢!我看到的所有例子都将整个类定义在一个文件中,所以我不知道原型应该是什么样子。 – Wheels2050 2012-07-08 20:00:32

-1

该构造函数是ambigious。这就是为什么。 如果你有两个构造

Monster(){} 
Monster(x=10){} 

和您拨打一个电话 怪物M();

应该如何编译器知道你是否指的是第一或第二个构造 而是将其定义如下

class Class { 
private: 
    int mValue; 
public: 
    Class(int val) :mValue(val){} 
    Class() :mValue(1){} 
}; 
+0

构造函数没有歧义,根本没有匹配。 – 2012-07-08 20:18:48