首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到C++默认构造函数

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

Stack Overflow用户
提问于 2012-07-09 03:53:43
回答 2查看 1.5K关注 0票数 2

我在使用Visual C++ 2010学习版中的某些代码时遇到问题。我正在尝试创建一个具有构造函数的类,该构造函数接受具有默认值的参数。下面是一个简短的程序,它展示了我想要实现的目标:

代码语言:javascript
复制
//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是正确初始化的。

然而,在第二个程序中,我试图做完全相同的事情。我有一个定义如下的类:

代码语言:javascript
复制
namespace mobs {
    Class Monster {
    private:
        mHitPoints;
    public:
        Monster(int);
        int GetHitPoints() const;
    };
}

通过如下函数的实现:

代码语言:javascript
复制
namespace mobs {

    Monster::Monster(int hp=10) : mHitPoints(hp)
    {
    }

    int Monster::GetHitPoints() const
    {
        return mHitPoints;
    }
}

但是当我尝试声明一个类并像这样使用GetHitPoints()函数时:

代码语言:javascript
复制
mobs::Monster testmonster;
cout << testmonster.GetHitPoints() << endl;

Visual C++告诉我“类mobs::Monster不存在默认的构造函数”。为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-09 03:57:25

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

Monster(int hp = 10)

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

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

只是为了说明一下,这里有一个默认设置。

票数 5
EN

Stack Overflow用户

发布于 2012-07-09 04:02:06

构造函数不明确。怪不得。如果您有两个构造函数

代码语言:javascript
复制
Monster(){}
Monster(x=10){}

然后你调用一个Monster m();

编译器应该如何知道是指第一个构造函数还是第二个构造函数,并按如下方式定义它

代码语言:javascript
复制
class Class {
private:
    int mValue;
public:
    Class(int val) :mValue(val){}
    Class() :mValue(1){}
};
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11386159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档