首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++默认构造函数缺位,我无法编译

C++默认构造函数缺位,我无法编译
EN

Stack Overflow用户
提问于 2015-08-04 22:07:52
回答 3查看 801关注 0票数 0

我有一个非常简单的课程

代码语言:javascript
复制
class myclass {

public:
    int id;
    double x, y, z;

    myclass() = default; // If I omit this line I get an error
    myclass(int ID, double X, double Y, double Z): id(ID), x(X), y(Y), z(Z) {};
};

如果我省略了行myclass() = default;,然后尝试创建一个对象

代码语言:javascript
复制
#include <vector>
using namespace std;
int main() {

    int ID = 0;
    double X = 1.0, Y = 2.0, Z = 3.0;
    vector<myclass> a_vector(10);

    myclass an_object(ID,X,Y,Z);

    return 0;
}

我得到一个错误no matching function for call to ‘myclass::myclass()

这一切为什么要发生?什么时候必须指定不使用参数作为默认参数的构造函数?

这可能是一个非常简单的问题,但关于构造函数的其他问题似乎针对的是非常具体的构造函数问题,因此我认为这可能是值得的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-04 22:10:21

一旦提供了任何构造函数,编译器就不再为您提供其他构造函数--您将完全控制。因此,当您有一个接受一些参数时,就不再提供不需要参数的参数。

票数 6
EN

Stack Overflow用户

发布于 2015-08-04 22:38:47

问题在于,vector of myclass - vector有许多使用默认构造函数的方法。如果您像以前一样提供自己的构造函数,通常的默认构造函数不会为您生成。通过使用= default添加声明,您强制编译器生成缺少的默认值。如果自动生成的构造函数不够,也可以定义自己的默认构造函数,但是没有构造函数就无法使用vector

票数 2
EN

Stack Overflow用户

发布于 2015-08-04 22:23:39

因为您没有为第二个构造函数指定访问修饰符,所以默认情况下它是私有的。

只需向构造函数中添加public:

代码语言:javascript
复制
class myclass
{

int id;
double x, y, z;

public:

//myclass() = default; // If I omit this line I get an error
myclass(int ID, double X, double Y, double Z): id(ID), x(X), y(Y), z(Z) {};

};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31820235

复制
相关文章

相似问题

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