@nghd

Как правильно подключить #include?

Желательно с обьяснением чтобы боевой вертолет ми28 понял

includes.hpp
#pragma once
...
#include "window.hpp"
#include "image.hpp"

In included file: unknown type name 'c_image'clang(unknown_typename)
window.hpp(24, 25): Error occurred here


image.hpp
#pragma once
#include "includes.hpp"
class c_image {
        ...
        auto b_draw(c_window &c_window_) -> bool;
};

In included file: unknown type name 'c_image'clang(unknown_typename)
window.hpp(24, 25): Error occurred here


window.hpp
#pragma once
#include "includes.hpp"
class c_window {
        ...
        auto v_draw(c_image &c_image_) -> void;
};

In included file: unknown type name 'c_window'clang(unknown_typename)
image.hpp(42, 21): Error occurred here
  • Вопрос задан
  • 152 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас тут циклическая зависимость: c_image использует c_window, который использует c_image

Надо forward declaration расставить кое где. Чтобы не было зависимости от порядка include в файлах, стоит, наверно, расставить их в обоих файлах:
class c_image;
class c_window {
// ...
}


И для красоты стоит image.hpp включать не в window.hpp, а window.cc. Ну и для второго класса аналогично сделать.

Но лучше иерархию классов перетряхнуть. Такие циклические зависимости - это плохо. Надо использовать какой-то базовый класс с общим интерфейсом. Тогда и window и image будут принимать вот этот вот базовый интерфейс, а не конкретный тип.

Edit: Да, ошибка возникает потому, что в каком-то cc файле сначала вставился image.hpp, из которого вставился window.hpp (внутренний image.hpp в нем не вставляется из-за pragma once. Иначе бы была бесконечная рекурсия). В итоге у вас в .cc файле сначала идет определение класса window, и только потом класса image.
Ответ написан
Комментировать
@nghd Автор вопроса
includes.hpp
#pragma once
...
class c_window;
class c_image;
#include "window.hpp"
#include "image.hpp"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Если буквально переводить ошибку
In included file: unknown type name 'c_image'clang(unknown_typename)
window.hpp(24, 25): Error occurred here

То будет - во включаемом файле неизвестное имя типа c_image
и ошибка находится здесь window.hpp(24, 25)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы