为什么我不能实例化类中的对象?

Why can't I instantiate an object in a class?

提问人:Elijah Campbell 提问时间:8/21/2023 更新时间:8/21/2023 访问量:80

问:

我有这三个代码:

#pragma once

class Rect
{
private:
    int m_Thing;
public:
    Rect(int thing)
    {
        m_Thing = thing;
    }

    void create(int thing)
    {
        m_Thing = thing;
    }
};
#pragma once
#include "Rect.h"

class Brick
{
private:
    Rect floatRect;
public:
    Brick()
    {
        floatRect.create(28);
    }
};
#include "mre.h"
#include <iostream>

int main()
{
    Brick brick;
}

出于某种原因,我收到一个错误,说我需要一个默认构造函数。我做了一个,然后在 Rect 对象上收到一个未解决的外部符号错误。这就是我被困住的地方。如何实例化它?

C++ 链接器错误 SFML

评论

0赞 Pepijn Kramer 8/21/2023
编译器是正确的,通过声明非默认构造函数,默认构造函数将被删除(对于 Rect)。Brick 的隐式声明构造函数尝试调用 Rect 的默认构造函数。
0赞 Pepijn Kramer 8/21/2023
另请注意:当您有一个带有一个参数的构造函数时,请将其设为 .所以explicitexplicit Rect(int value)
1赞 Some programmer dude 8/21/2023
在调用构造函数的函数体之前,将构造所有成员。由于您没有显式构造(或初始化)成员,因此它将是默认构造的。而且你的类没有默认的构造函数。您需要将初始化器列表添加到构造函数中:BrickfloatRectRectBrickBrick() : floatRect(28) { /* Empty constructor body */ }
1赞 Pepijn Kramer 8/21/2023
有关构造函数的文档,请参阅默认构造函数并注意: 删除了隐式声明的默认构造函数
1赞 molbdnilo 8/21/2023
该函数使它看起来您错过了构造函数的要点。create

答:

1赞 Karen Baghdasaryan 8/21/2023 #1

调用类的默认构造函数时,除非以其他方式指定,否则其所有成员都是默认构造的。如果我们想写出在 的调用中明确发生的事情,它看起来像这样。Brick()

Brick() : floatRect()
{
    floatRect.create(28);
}

在这里,我们可以看到,在成员初始值设定项列表中,它尝试调用默认构造函数 ,该构造函数被隐式删除,因为您有一个用户定义的构造函数。如果要创建,可以执行以下操作。RectRect

Brick() : floatRect(28)
{
    
}

成员初始化字段专门用于初始化参数或将参数传递给成员的构造函数。