Возможны ли взаимно рекурсивные классы? - PullRequest
5 голосов
/ 12 января 2012

Я прочитал , как это можно сделать для работы , используя предварительные декларации.

class A
{
    public:
    B *objB;

    void foo(){}
}

class B
{
    public:
    A *objA;

    void foo(){}
}

Просто хотел подтвердить, возможен ли когда-либо такой дизайн?

class A
{
    public:
    B objB;

    void foo(){}
}

class B
{
    public:
    A objA;

    void foo(){}
}

PS: Если кто-то мог бы также объяснить, почему / почему это невозможно логически с точки зрения классов, а не только с точки зрения языка, как, например, цитируя некоторый пример.Что именно это означает с точки зрения классов?

Ответы [ 4 ]

11 голосов
/ 12 января 2012

Второй пример невозможен.В нем говорится, что пространство, выделенное для A, содержит пространство для B, которое, в свою очередь, содержит пространство для A и т. Д. Для этого потребуется бесконечное количество памяти и потребуется бесконечное количество времени дляпостроить.

3 голосов
/ 12 января 2012

Нет, это невозможно ни с точки зрения языка, ни с точки зрения классов.

С точки зрения классов: каждый экземпляр A содержит экземпляр B, который содержит экземпляр A, который ... => бесконечныйрекурсии.Это не проблема с версией указателя, поскольку указатель может не указывать на действительный объект или все указатели A могут указывать на один и тот же объект и т. Д.

0 голосов
/ 12 января 2012

3.9 / 5 говорит:

Класс, который был объявлен, но не определен, или массив неизвестного размера или типа неполного элемента, является не полностью определенным типом объекта.43 Не полностью определенные типы объектов и типы void являются неполными типами (3.9.1 ). Объекты не должны определяться как имеющие неполный тип.

Во втором примере класс A пытается определить переменную-член с неполным типом, поэтому он некорректно сформирован.

0 голосов
/ 12 января 2012

Взаимно рекурсивные классы, такие как ваш второй пример, невозможны. Если бы у каждого экземпляра был соответствующий экземпляр другого класса, и поскольку нет базового случая, чтобы остановить рекурсию, размер класса был бы бесконечным. Очевидно, было бы трудно создать экземпляр такого большого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...