Вопрос

У меня есть два класса, и оба они используют некоторые из других классов, например:

// 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 из базового класса.Это может решить проблему циклической зависимости.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top