Два класса и встроенные функции
-
19-09-2019 - |
Вопрос
У меня есть два класса, и оба они используют некоторые из других классов, например:
// class1.h
class Class1;
#include "class2.h"
class Class1 {
public:
static Class2 *C2;
...
};
// class2.h
class Class2;
#include "class1.h"
class Class2 {
public:
static Class1 *C1;
...
};
И когда я определяю это, как в примере выше, это работает (у меня также есть некоторые #ifndef
чтобы избежать бесконечной повторяемости заголовка).Но я также хочу добавить некоторые встроенные функции в свои классы.И я прочитал здесь что я должен поместить определение встроенной функции в заголовочный файл, потому что это не сработает, если я помещу их в cpp-файл и захочу вызвать их из другого cpp-файла (когда я делаю это, я получаю неопределенную ссылку во время компоновки).Но проблема здесь заключается в чем-то подобном этому:
// class1.h
...
inline void Class1::Foo() {
C2->Bar();
}
Я получаю сообщение об ошибке:недопустимое использование неполного типа ‘struct Class2’.
Так как же я могу это сделать?
Решение
Вам нужно отложить включение заголовка, а затем включить его и определить встроенные методы.Делая это в каждом заголовке, они становятся самодостаточными, и включение одного всегда будет включать в себя другой. включить охрану предотвращение бесконечной рекурсии.
А.hpp
#ifndef INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
#define INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
struct B;
struct A {
B* p;
void foo();
};
#include "B.hpp"
inline
void A::foo() {
if (p) p->bar();
}
#endif
Б.хпп
#ifndef INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
#define INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
struct A;
struct B {
A* p;
void bar();
};
#include "A.hpp"
inline
void B::bar() {
if (p) p->foo();
}
#endif
Другие советы
Вы все перепутали.То, чего ты хочешь, это:
// class1.h
class Class2;
class Class1 {
public:
static Class2 *C2;
...
};
// class2.h
class Class1;
class Class2 {
public:
static Class1 *C1;
...
};
И включите соответствующие заголовки в исходный код.Линия:
class Class1; // or Class2
Объявляет неполный тип, и у вас могут быть указатели и ссылки на неполные типы.Однако после использования он должен быть полным.Поэтому просто скажите "эй, это будет существовать!" в заголовке, а в исходном коде укажите, что это такое.
Я предлагаю поместить общие методы и члены в базовый класс, а затем вывести C1 и C2 из базового класса.Это может решить проблему циклической зависимости.