2012-07-08 137 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