Я получаю недопустимое использование ошибок класса неполного типа в C++, как правильно включить заголовочные файлы?
Этот вопрос был здесь раньше, но решения не работали для моего конкретного случая (или я не знаю, как перенести их в мой код). У меня есть что-то вроде этого (упрощено только для рассматриваемых методов)
Calendar.hpp файл:
#pragma once
#include "View.hpp"
class View;
class Calendar {
View * v;
public:
bool SetView(const View &newView) {
v = newView.clone();
return true; }
View.hpp файл:
#pragma once
#include "Calendar.hpp"
class Calendar;
class View {
public:
View(){};
virtual View * clone() const = ;
Файл YearView.hpp:
#pragma once
#include "View.hpp"
class View;
YearView : public View {
public:
YearView(){};
View * clone() const override {
return new YearView(); }
Когда я компилирую, я получаю сообщение об ошибке "недопустимое использование неполного типа" const class View "" в строке v = newView.clone();
Что может быть причиной этого, пожалуйста? Кроме того, есть ли способ включить YearView.hpp в файл Calendar.hpp? Я хотел бы использовать его по умолчанию, установить 'V' в конструкторе календаря для конкретного типа YearView.
2 ответа
У вас есть круговой включить между calendar.hpp
а также view.hpp
Полагаю, вы пытались разорвать этот цикл, добавив предварительные объявления.
Проблема в том, что вы используете в ваших заголовках объявленные заранее классы. Объявленный заранее класс может использоваться только в объявлениях, вы не можете создавать новые экземпляры класса или вызывать какие-либо его методы.
Если вы перенесете реализацию ваших методов в ваши файлы cpp, то это должно решить вашу проблему.
Calendar.hpp
включает в себя View.hpp
который включает в себя Calendar.hpp
... Это тот цикл, который нужно разорвать.
И вы делаете это, не включая Calendar.hpp
в View.hpp
файл. Это должно работать, потому что View.hpp
на самом деле ничего не использует от Calendar.hpp
,
Итак View.hpp
файл должен выглядеть примерно так
#pragma once
class View {
...
};
Предварительные декларации View
в других заголовочных файлах не требуется, так как вы включаете View.hpp
файл. И вам нужно включить View.hpp
файл, потому что вы используете View
класс для более чем объявлений.