То, что вы пытаетесь сделать, невозможно. Ваш класс занял бы бесконечное пространство.
Вы получили Dog
, который имеет переменную Cat
члена, который имеет переменную Dog
члена, который имеет переменную Cat
члена, который имеет переменный с Dog
членом ...
Не нарушая его где-то с указателем вы В конечном итоге бесконечные рекурсивные переменные-члены берут бесконечную память, что невозможно.
Обратите внимание, что компилятор не может даже рассчитать память, необходимую для Dog
или Cat
из-за бесконечной рекурсии. Но так как класс в C++ не может быть размером 0
, мы знаем, что это будет бесконечное пространство.
Другие ответы также дают хорошие перспективы, т. Е. Проблема «Курица и яйцо», из которой нужно определить сначала, чтобы определить другую.
Я просто хочу добавить, что взаимно рекурсивные классы нечто странное и лучше избегать, если вы можете создать его другим способом. Если вам действительно нужно их использовать, убедитесь, что вы действительно нарушите рекурсивность. В противном случае вы меняете его только с ошибкой во время компиляции из-за бесконечной взаимной рекурсии на исчерпание памяти и сбоя во время выполнения, если вы получили наивную реализацию с указателями, которые совершают бесконечные взаимно-рекурсивные вызовы new
во время построения.
почему опережающее объявление не решить ее? – dlavila
Ответ: Нет. Как бы вы построили объект, который содержит себя? Вы также должны переосмыслить свой дизайн, если считаете, что вам нужно такое. – StoryTeller
Это не может быть так, как вы хотите, поскольку, даже если вы можете разрешить порядок объявления, для каждого класса логически невозможно скрыть другой. Нужно иметь указатель или ссылку; и что не нужно включать заголовок. –