Класс A нуждается в классе B, который нуждается в классе A и всех его членах

Я определенно в отчаянном случае … Используя C ++, я определил эти два класса:

// Console.hpp
#ifndef CLASS_Console
#define CLASS_Console
#include <iostream>
#include "Window.hpp"
class Console
{
public:
Window *Win;
Console(Windows *Win); // Which then does "this->Win = Win;"void AppendText(std::string);
// And some more dozens functions
};
#endif

// Window.hpp
#ifndef CLASS_Window
#define CLASS_Window
#include <iostream>
#include "Size.hpp"
class Window
{
private:
Console *m_Console;

public:
Window(); // Which then does "m_Console = new Console(this); m_Console->AppendText("YEAH");"Console *getConsole(); // For use by another classes
Size getSize();
// And some more Tens and Tens of functions
};
#endif

Сначала скажут: «Используйте предварительную декларацию!»

Но учитывая, что мне нужно получить доступ к ряду этих десятков функций (в одну и в другую сторону), можно ли как-нибудь избежать использования предварительного объявления?

Спасибо за ваши (будущие) ответы!

2

Решение

Но учитывая, что мне нужно получить доступ к ряду этих десятков функций (в одну и в другую сторону), можно ли как-нибудь избежать использования предварительного объявления?

Я не уверен, что вы понимаете, что делает предварительная декларация. Вам нужно только предоставить один предварительная декларация в window.hpp за Console, а затем включить console.hpp от window.cpp,

5

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

Нет, нет способа избежать (по крайней мере) предварительного заявления.

Но учитывая, что мне нужно получить доступ к ряду этих десятков функций

Почему это имеет значение? Спектакль? Вы что-нибудь уже измерили? Если нет, вы не можете говорить о производительности.

3

Нормальная структура:

  1. объявить первый класс: class Console;
  2. определить второй класс: class Window { Console *c; ...};
  3. определить первый класс: class Console { Window *w; ... };
  4. определить функции-члены Console::Console() { ... } ...

Первого объявления класса достаточно, чтобы вы могли написать определение другого класса (без определения функций-членов).

Затем после определений обоих классов функции-члены объявляются, поэтому код для функций-членов может по мере необходимости использовать члены другого класса.

1

Если только один из этих классов должен быть доступен извне, вы можете подумать о вложении Консоли в Window (или наоборот).

0