Где я могу ввести заголовок базового класса для двух производных заголовков?

Пробовал читать ответы на другие вопросы, но ни один из них не помог мне.

//Equipment.h
#pragma once
class Equipment {
//...
};
//Display.h
#pragma once
class Display :public Equipment { //here is the error
public:
    Display(int id, int price, int year);
};
//Display.cpp
#pragma once
#include "Display.h"
#include "Equipment.h"
Display::Display(int id=0, int price=0, int year=0) {
    int arr[3 + 1] = { id, price, year };
    //Equipment(int id, int price, int year);
}
//Printer.h and .cpp are very similar
//in composition to Display.h and .cpp
//error is in a similar position too
//source.cpp
#include<iostream>
using namespace std;

#include "Printer.cpp"
#include "Display.cpp"

Я действительно не знаю, куда поместить включаемый файл базового класса Equipment.h. Пытался вставить его в исходный код и подумал, что это сработает, если я вставлю его первым, нет.

Попытался поместить включаемый файл в оба производных заголовка, появилась другая ошибка, относящаяся к «уже определенному в Display.obj».

Все файлы заголовков и cpp должны существовать, и я понятия не имею, как разместить включаемые файлы.


person Chinguun Erdenebadrakh    schedule 21.04.2020    source источник
comment
Основное практическое правило: компилировать только файлы cpp, включать только файлы hpp.   -  person cigien    schedule 21.04.2020
comment
@cigien Правило задачи заключалось в том, что мне нужно было добавить Display.cpp и Printer.cpp для объявленной реализации члена. Так что я подумал, что это путь. Каким-либо другим способом я могу сделать это, не включая cpp?   -  person Chinguun Erdenebadrakh    schedule 21.04.2020
comment
Включение в шапку - правильное решение. У вас есть проблема с заголовком вашего оборудования, которая мешает ему работать. Предоставьте минимальный воспроизводимый пример   -  person Alan Birtles    schedule 22.04.2020


Ответы (2)


Глядя на то, где произошла ошибка (строка с //here is the error), компилятор еще не «увидел» класс Equipment, когда пытается скомпилировать Display.h. Вы можете решить эту ошибку, #include используя Equipment.h в Display.h.

Как упоминалось в одном из комментариев, вы должны избегать #include-файлов .cpp в своем коде. Исходные файлы должны быть скомпилированы, а затем связаны.

person Azam Bham    schedule 21.04.2020

Оборудование.ч

#pragma once
class Equipment {
    //,,,
};

Дисплей.ч

#pragma once
#include "Equipment.h"
class Display :public Equipment {
public:
    Display(int id, int price, int year);
};

Принтер.ч

#pragma once
#include "Equipment.h"
class Printer : public Equipment {
    Printer();
};

Display.cpp

#include "Display.h"
Display::Display(int id=0, int price=0, int year=0) {
    int arr[3 + 1] = { id, price, year };
    //Equipment(int id, int price, int year);
}

Принтер.cpp

#include "Printer.h"
Printer::Printer() {
    //...
}

источник.cpp

#include "Printer.h"
#include "Display.h"
#include<iostream>
using namespace std;

//use Printer and Display
person Isaac Clancy    schedule 21.04.2020