Возможны ли взаимно рекурсивные классы?

Я прочитал как это можно заставить работать с помощью предварительных объявлений.

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: Если бы кто-нибудь мог также объяснить, почему/почему это невозможно логически с точки зрения классов, а не только с точки зрения языка, например, процитировав какой-нибудь пример. Что именно это означает с точки зрения классов?


person Amit Tomar    schedule 12.01.2012    source источник


Ответы (4)


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

person Oliver Charlesworth    schedule 12.01.2012

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

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

person Jon    schedule 12.01.2012

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

person Mark B    schedule 12.01.2012

3.9/5 сообщает:

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

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

person BЈовић    schedule 12.01.2012