Проблема с конструкторами и включением заголовков - PullRequest
0 голосов
/ 28 февраля 2019

Полагаю, это может быть концептуальной проблемой, но я не смог найти ничего, что могло бы ее решить.Я новичок в C ++, и у меня проблемы с включениями (я работаю в Visual Studio 2017 на Windows 10 ).Я создал эти классы:

  • Шейдер
  • Материал
  • Сетка

Каждый из них со своими файлами .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 выдаст мне эту ошибку (пометив красной скобкой первую скобку конструктора):

Не существует конструктора по умолчанию для класса «Материал»

Почему предполагается, что я определяю конструктор класса Material только путем включения Material.h в заголовок класса Mesh?Другая проблема возникает, если я просто удаляю конструктор и пытаюсь создать объект типа Mesh, например, в Main.cpp.Если я сделаю это (разрешив Mesh с конструктором по умолчанию):

Mesh m = Mesh();

Компилятор скажет:

На конструктор по умолчанию Mesh :: Mesh нельзя ссылаться - это -удаленная функция

Я не знаю, что делать или что искать.Надеюсь, я дал вам необходимую информацию, чтобы помочь мне, спасибо заранее!

1 Ответ

0 голосов
/ 28 февраля 2019

Звучит так, как будто вы что-то упустили из своего примера кода.Класс Mesh имеет член данных типа Material, не так ли?Material не имеет конструктора по умолчанию, поэтому каждый конструктор для Mesh должен явно инициализировать член Material.

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

Добавить список инициализатора.Предполагая, что элемент данных имеет имя m, конструктор должен выглядеть следующим образом:

Mesh::Mesh(Material mat)
: m(mat) // initializes m
{
}
...