构造函数和包含标题的问题
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 类型的成员变量,是的。那么,如果构造函数仅用于传递“材料”对象,我必须添加您的代码并将主体留空?以上是关于构造函数和包含标题的问题的主要内容,如果未能解决你的问题,请参考以下文章
为啥当类包含任何参数化构造函数时编译器不提供默认构造函数? [复制]