Я получаю недопустимое использование ошибок класса неполного типа в 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 класс для более чем объявлений.

Другие вопросы по тегам