【问题标题】:C++ disabled copy constructor, can't create objectC++ 禁用复制构造函数,无法创建对象
【发布时间】:2018-07-11 06:06:41
【问题描述】:

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

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;

【问题讨论】:

  • 声明构造函数会禁用默认构造函数。从未测试过复制构造函数是否也会发生这种情况,但看起来像。
  • 添加一个MyClass () = default; 应该可以解决它。
  • 默认构造函数是默认创建的除非您决定创建或删除任何其他构造函数,那么您必须明确说明要保留哪个构造函数
  • 因为规则5。如果你需要手动定义一个复制构造函数,编译器生成的默认构造函数很可能是错误的,因此不会生成。其他 5 个特殊成员函数基本相同。

标签: c++ oop constructor


【解决方案1】:

问题是你没有默认构造函数,所以报错:

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

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

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

您需要声明一个默认构造函数。从上面的链接(以及hinted to by @user4581301)继续阅读:

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

可以这样做:

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

【讨论】:

  • 我明白了。所以即使我没有真正实现复制构造函数,只是简单地删除了它,我的这种干扰足以让编译器不想再创建默认构造函数了?
  • @BaronYugovich 准确地说是您声明它已删除。当你开始说这个类有特殊(不寻常的)行为时,编译器就会放弃并要求你告诉它如何处理它默认实现的成员函数。
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多