Могу ли я #include в .hpp файлы?

У меня есть класс под названием А, который имеет свой .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,

0

Решение

Как уже упоминалось, вы часто можете обойти #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

Тогда вы не получите сообщение об ошибке, например, «класс А» уже определен.

3

Другие решения

Если это вектор B*Вам не нужно включать B.hpp в другом заголовке. Предварительная декларация в порядке. Указатели имеют одинаковый размер, независимо от того, на что они указывают.

Предполагается, что включение включает только при необходимости, и это, похоже, не так.

1

Я не знаю, понимаю ли я вашу иерархию классов, на мой взгляд, это так:

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 файлы, когда это возможно.

1
По вопросам рекламы [email protected]