Есть ли способ сделать класс рекурсивным?

Поэтому я хотел бы создать класс, который может иметь объект, тип которого сам по себе. Что-то вроде этого:

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". Есть ли способ сделать это?

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

AndyG 10.02.2019 21:23

Каков будет размер объекта этого класса? Это невозможно вычислить, поэтому компилятор не будет знать, сколько памяти выделить.

ForceBru 10.02.2019 21:24

Какую проблему вы на самом деле пытаетесь решить с помощью такой (невозможной) конструкции?

πάντα ῥεῖ 10.02.2019 21:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
161
2

Ответы 2

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

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

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

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

1mp0551bl3 11.02.2019 15:04

@ 1mp0551bl3 goo содержит все, что содержит foo. Такова природа наследования.

Lightness Races in Orbit 11.02.2019 17:50

С... Извини, мой плохой

1mp0551bl3 11.02.2019 18:39

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

Другие вопросы по теме