Есть ли способ сделать класс рекурсивным? - PullRequest
0 голосов
/ 10 февраля 2019

Итак, я хотел бы создать класс, который может иметь объект, тип которого сам по себе.Примерно так:

class foo {

    foo Avalue = foo();
    foo Bvalue = foo();

    foo(int a, int b) {
        Avalue = goo(a);
        Bvalue = goo(b);
    }

    foo(foo a, int b) {
        Avalue = foo(a);
        Bvalue = goo(b);
    }

    foo(foo a, foo b) {
        Avalue = foo(a);
        Bvalue = foo(b);
    }
}

class goo : foo {

    int value;
}

, чтобы я мог иметь рекурсивный объект, который всегда оканчивается на объектах "goo".Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Проблема в том, что foo внутри foo будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать fooкоторый будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, которыйбудет содержать foo, который будет содержать ...

0 голосов
/ 10 февраля 2019

Нет.Это принципиально невозможно.Подумайте об этом: класс будет иметь бесконечный размер (ну, если, конечно, у него нет других членов, но тогда что он делает?), И нет доказуемого определения / идентичности.

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

Ваш код предполагает, что вы реализуете дерево,Это причина (ну, я полагаю, одна из немногих), что std::map, который обычно является деревом, динамически создает свои узлы и связывает их с указателями.Как и каждая реализация связанного списка.

...