找不到C ++默认构造函数

时间:2012-07-08 19:53:43

标签: c++ constructor

我在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;。这是为什么?

2 个答案:

答案 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){}
};