C ++禁用了复制构造函数,无法创建对象

时间:2018-02-01 01:07:53

标签: c++ oop constructor

我没有为我的类提供任何自定义构造函数,我所做的就是禁用复制构造函数:

private:
MyClass(const MyClass& other) = delete; // disable copy ctor

现在,当我尝试在堆栈上创建此类的实例时

MyClass myInstance;

我收到如下编译错误:

main.cpp:16:16: error: no matching function for call to ‘MyClass::MyClass()’

好像我无意中禁用了默认构造函数?或许复制构造函数在那里被调用,我只是不知道如何。

这是一个例子

class MyClass {
public:
    int someField;

private:
    MyClass(const MyClass& other) = delete; // disable copy ctor
    MyClass& operator=(MyClass other) = delete; // disable assignment

};

错误

g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -MMD -MP -MF"proj/main.d" -MT"pitch/main.o" -o "proj/main.o" "../proj/main.cpp"
../proj/main.cpp: In function ‘int main()’:
../proj/main.cpp:17:10: error: no matching function for call to ‘MyClass::MyClass()’
  MyClass ins;

1 个答案:

答案 0 :(得分:5)

问题是您没有默认构造函数,因此出现错误:

  

../proj/main.cpp:17:10:错误:没有匹配函数来调用'MyClass :: MyClass()'

您可能会感到困惑,因为在您宣布禁用的复制构造函数之前,您的代码运行正常。这是因为compiler will generate a default constructor for any class without a constructor already declared

  

如果没有为类类型(struct,class或union)提供任何类型的用户声明构造函数,编译器将始终声明默认构造函数

您需要声明默认构造函数。阅读以上链接(以及hinted to by @user4581301):

  

如果存在一些用户声明的构造函数,则用户仍可强制编译器自动生成默认构造函数,否则将使用关键字default隐式声明。

这可以这样做:

class MyClass {
public:
    MyClass() = default;
    int someField;