我想这可能是一个概念上的问题,但是我找不到任何解决方法。我是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的默认构造函数无法引用--它是一个 功能已删除
我不知道该怎么做或要搜索什么。希望我能给您必要的信息以帮助我,
答案 0 :(得分: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
{
}