为什么我的构造函数一直引用C++中的默认构造函数?[副本]

icnyk63a  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(194)

此问题已在此处有答案

error: no matching function for call to ‘Point::Point()(1个答案)
Use class as type in other class constructor(3个答案)
7天前关闭
我正在学习C++(20)。请看我的代码:
MyClass.h

class Spec
{
private:
    int number;

public:
    Spec() = delete;
    Spec(int);
};

class MyClass
{
private:
    int id;
    Spec spec;

public:
    MyClass() = delete;
    MyClass(int, Spec);
};

MyClass.cpp

#include "MyClass.h"

Spec::Spec(int number)
{
    this->number = number;
}

MyClass::MyClass(int id, Spec spec)
{
    this->id = id;
    this->spec = spec;
}

编译时返回:

/src/Hai.cpp: In constructor ‘MyClass::MyClass(int, Spec)’:
/src/Hai.cpp:8:35: error: use of deleted function ‘Spec::Spec()’
    8 | MyClass::MyClass(int id, Spec spec)

我没有使用任何默认的构造函数,我甚至把它删除了.我不会在任何地方调用这些类的默认构造函数,我也不希望这些类是默认构造的。为什么编译器还问我应该有默认构造函数?是不是和复印操作有关?添加默认构造函数将处理错误,但我只是想知道为什么。

00jrzges

00jrzges1#

private: Spec spec;,并且在MyClass的构造函数中没有成员初始化器列表,这导致为spec运行默认构造函数。
您的代码初始化了构造函数的)(参数结束)和{(代码开始)之间的成员,然后在构造函数中赋值。
使用成员初始值设定项:

MyClass::MyClass(int id, Spec spec)
: id{id}, spec{spec}                   //  <- member initializer list
{
}
id{id}
   ^ refers to the parameter id
^ refers to this->id
  ^  ^ uniform initialization curly braces

相关问题