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

Bar*_*ich 4 c++ oop constructor

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

private:
MyClass(const MyClass& other) = delete; // disable copy ctor
Run Code Online (Sandbox Code Playgroud)

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

MyClass myInstance;
Run Code Online (Sandbox Code Playgroud)

我得到一个像这样的编译错误:

main.cpp:16:16: error: no matching function for call to ‘MyClass::MyClass()’
Run Code Online (Sandbox Code Playgroud)

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

这是一个例子

class MyClass {
public:
    int someField;

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

};
Run Code Online (Sandbox Code Playgroud)

而错误

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;
Run Code Online (Sandbox Code Playgroud)

Tas*_*Tas 5

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

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

您可能会感到困惑,因为在您声明禁用的复制构造函数之前,您的代码运行正常.这是因为编译器将为没有已经声明的构造函数的任何类生成默认构造函数:

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

您需要声明一个默认构造函数.从上面的链接阅读(并由@ user4581301暗示):

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

这可以这样做:

class MyClass {
public:
    MyClass() = default;
    int someField;
Run Code Online (Sandbox Code Playgroud)