构造函数和包含标题的问题

Posted

技术标签:

【中文标题】构造函数和包含标题的问题【英文标题】:Problem with constructors and including headers 【发布时间】:2019-02-28 17:30:56 【问题描述】:

我想这可能是一个概念问题,但我找不到任何解决方法。我是 C++ 新手,但我遇到了包含问题(我在 Windows 10 上使用 Visual Studio 2017)。我创建了这些类:

着色器 材质 网格

它们中的每一个都分别带有它们的 .h 和 .cpp 文件。他们每个人的.h看起来像这样:

Shader.h

#pragma once
class Shader

public:
    //Default constructor
private:
    //Some stuff

Material.h

#pragma once
#include "Shader.h"

class Material

public:
    Material(Shader s);
private:
    //Some stuff

Mesh.h

#pragma once
#include "Material.h"

class Mesh

public:
    Mesh(Material m);
private:
    //Some stuff

问题出现在Mesh.cpp中,当我写这个时:

Mesh.cpp

#include "stdafx.h"
#include "Mesh.h"

Mesh::Mesh(Material mat)



如果我这样写,Visual Studio 会给我这个错误(在构造函数的第一个括号中标记为红色):

“材料”类不存在默认构造函数

为什么假设我仅通过在 Mesh 类的标头中包含 Material.h 来定义 Material 类构造函数?如果我只是删除构造函数并尝试在例如 Main.cpp 中创建 Mesh 类型的对象,则会出现另一个问题。 如果我这样做(让 Mesh 使用默认构造函数):

Mesh m = Mesh();

编译器说:

Mesh::Mesh 的默认构造函数不能被引用——它是一个 删除功能

我不知道该做什么或要搜索什么。希望我给了你必要的信息来帮助我,在此先感谢!

【问题讨论】:

相关/欺骗:***.com/questions/14219242/… 一旦你这样做Mesh(Material m);,编译器会自动删除默认构造函数。复制构造函数和赋值运算符照常生成。 Mesh() = default; - iff 编译器生成的默认构造函数适用于您的目的。 感谢您的回答!我回家后试试看 【参考方案1】:

听起来您在示例代码中遗漏了一些内容。 Mesh 类有一个 Material 类型的数据成员,不是吗? Material 没有默认构造函数,因此 Mesh 的每个构造函数都必须显式初始化 Material 成员。

Mesh::Mesh(Material mat)
 // no initializer for Material data member
)

添加一个初始化列表。假设数据成员名为m,构造函数应如下所示:

Mesh::Mesh(Material mat)
: m(mat) // initializes m


【讨论】:

它确实有一个 Material 类型的成员变量,是的。那么,如果构造函数仅用于传递“材料”对象,我必须添加您的代码并将主体留空?

以上是关于构造函数和包含标题的问题的主要内容,如果未能解决你的问题,请参考以下文章

记录文件、类和构造函数的正确方法是啥?

为啥当类包含任何参数化构造函数时编译器不提供默认构造函数? [复制]

类不包含构造函数错误

为啥这个核心转储错误发生在我的课堂上?我已经包含了复制构造函数、复制赋值和析构函数

类包含复制构造函数和赋值运算符时的继承行为

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数