2

我在使用 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 testClass 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++ 告诉我“类 mobs::Monster 不存在默认构造函数”。为什么是这样?

4

2 回答 2

5

The default value belongs in the declaration, not the definition. Move the =10 to your header file:

Monster(int hp = 10).

In the implementation, you don't even need the default value. I usually use:

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

just to make it clear there's a default.

于 2012-07-08T19:57:25.113 回答
-1

构造函数是模棱两可的。这就是为什么。如果你有两个构造函数

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

然后你打电话 Monster m();

编译器应该如何知道您是指第一个构造函数还是第二个构造函数,而是将其定义如下

class Class {
private:
    int mValue;
public:
    Class(int val) :mValue(val){}
    Class() :mValue(1){}
};
于 2012-07-08T20:02:05.767 回答