У меня есть 3 класса:
Class.h
ClassA
{
public:
ClassA();
};
ClassB.h
#include "ClassA.h"
classB
{
public:
ClassB();
private:
ClassA m_classA;
};
ClassC.h
#include "ClassB.h"
ClassC
{
public:
ClassC();
private:
ClassB m_classB;
};
ClassC нужен ClassB, а ClassB нужен ClassA. ClassC не нуждается в ClassA, поэтому я должен поместить #include "ClassA.h" внутри заголовка ClassB внутри исходного файла и сделать глобальный объект или есть лучший способ?
ClassB.cpp
#include "ClassB.h"
#include "ClassA.h"
ClassA g_classA;
1 ответ
ClassB
имеет объект ClassA
, поэтому для его объявления класса требуется полное объявление ClassA
. Поэтому вам необходимо включить заголовок ClassA.h
в ClassB.h
* , независимо от того, что происходит с ClassC
.
Если вы не хотите включать заголовки, вы можете сохранить (умный) указатель на classA
и объявить его вперед. Тогда вам нужно только включить classA.h
в classB.cpp
. Вот простой пример:
Через A.h
class A {};
Через B.h
#include <unique_ptr>
class A; // forward declaration of A
class B {
public:
B();
private:
std::unique_ptr<A> a_; // C++11 smart pointer expressing unique ownership
};
Через B.cpp
#include "B.h"
#include "A.h" // we need the full declaration here.
B::B() : a_(new A()) {}
* Строго говоря, ClassA.h
может быть включен в другие файлы, если он косвенно включен в ClassB.h
. Но лучше включать то, что вам нужно, там, где вам это нужно, и не зависеть от косвенных включений.
ClassA.h
до ClassB.h
работает так же хорошо, как включение его внутрь ClassB.h
. Это может быть хороший совет, но это не единственный способ.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.