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

时间:2019-02-28 17:30:57

标签: c++ visual-studio constructor compiler-errors header-files

我想这可能是一个概念上的问题,但是我找不到任何解决方法。我是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的默认构造函数无法引用--它是一个   功能已删除

我不知道该怎么做或要搜索什么。希望我能给您必要的信息以帮助我,

1 个答案:

答案 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
{
}