У меня есть класс под названием А, который имеет свой .cpp
а также .hpp
файлы. Это зависит от классов B
а также C
, Теперь мне интересно, я должен #include B.hpp
а также #include C.hpp
в A.cpp
или же A.hpp
? Я думаю, что было бы полезно для меня #include
в A.hpp
файл, потому что я создаю вектор B*
и я не уверен, что компилятор будет знать правильный размер B
если я только вперед объявить это (так что я не мог правильно увеличить указатель) … Под «прямое объявление» я имею в виду запись class B;
а также class C;
в начале A.hpp
,
Как уже упоминалось, вы часто можете обойти #include
вещи с использованием предварительных объявлений, и, действительно, лучшая практика — минимизировать количество включенных заголовков.
Но: Чтобы ответить на ваши вопросы, заголовок: да, вы можете, и общий механизм, чтобы избежать «кругового включения» заключается в следующем
A.hpp:
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
... // code
#endif
Теперь, если, скажем, B.hpp включает в себя A.hpp, а впоследствии, C.hpp выглядит так:
#ifndef C_HPP_INCLUDED
#define C_HPP_INCLUDED
#include "A.hpp"#include "B.hpp"
...
#endif
Тогда вы не получите сообщение об ошибке, например, «класс А» уже определен.
Если это вектор B*
Вам не нужно включать B.hpp
в другом заголовке. Предварительная декларация в порядке. Указатели имеют одинаковый размер, независимо от того, на что они указывают.
Предполагается, что включение включает только при необходимости, и это, похоже, не так.
Я не знаю, понимаю ли я вашу иерархию классов, на мой взгляд, это так:
B.hpp
class B
{
B();
};
B.cpp
B::B() {};
C.hpp
class C
{
C();
};
A.cpp
A::A() {};
A.hpp
class A
{
A();
B *b;
C *C;
};
A.cpp
#include "B.hpp"#include "C.hpp"
A::A() :
b(NULL), c(NULL)
{
};
Это правильно? (если нет, подумайте, пожалуйста, укажите код;) Если ваш class A
иметь указатели на class B
а также class C
предварительная декларация должна быть единственной вещью, в которой вы нуждаетесь.
Я не уверен, что компилятор будет знать правильный размер B, если я только форвард объявить его
Да, если вы включите B.hpp
а также C.hpp
в A.cpp
Файл компилятор сможет определить его размер (размер класса, размер указателя всегда одинаков). Зачем? Просто потому, что в cpp
файл знает правильный размер из-за #include
, я обнаружил этот ответ было бы полезно понять, что я пытаюсь сказать.
Было бы хорошо в hpp
файл вместо? Может быть, если ваш A.hpp
не будет включен в другие файлы class B
а также class C
не мешает и распространяется в другие файлы. Так что, если это так, то не будет необходимости. Но, ИМХО, лучшая практика — это заранее объявить и #include
в cpp
файлы, когда это возможно.