Поэтому я хотел бы создать класс, который может иметь объект, тип которого сам по себе. Что-то вроде этого:
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". Есть ли способ сделать это?
Каков будет размер объекта этого класса? Это невозможно вычислить, поэтому компилятор не будет знать, сколько памяти выделить.
Какую проблему вы на самом деле пытаетесь решить с помощью такой (невозможной) конструкции?





Нет. Это принципиально невозможно. Подумайте об этом: класс будет иметь бесконечный размер (ну, если у него нет других членов, я полагаю, но тогда что он делает?), и не будет доказуемого определения/идентичности.
Однако вы можете хранить указатели на другие объекты foo. Это работает до тех пор, пока не каждый foo имеет указатель члена, который делает указывает на другой foo, или если ссылки образуют циклическую зависимость. В любом случае компилятор не будет диагностировать это так, как он должен с вашим решением, но вы можете столкнуться с проблемами во время выполнения, если не будете осторожны.
Ваш код предполагает, что вы реализуете дерево. Это причина (ну, я полагаю, одна из немногих), что std::map, который обычно представляет собой дерево, динамически создает свои узлы и связывает их с указателями. Как и любая реализация связанного списка.
Как вы сказали, я хочу создать древовидную структуру, но я не понимаю, почему она может быть бесконечной. В начале у вас будет объект foo, который может содержать другие объекты foo или объекты goo, которые могут хранить только значение и не могут хранить другие экземпляры объектов foo, это остановит рекурсивное поведение. Это будет означать, что основной объект будет иметь фиксированный размер.
@ 1mp0551bl3 goo содержит все, что содержит foo. Такова природа наследования.
С... Извини, мой плохой
Проблема в том, что foo внутри foo будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать foo, который будет содержать...
Если у вас есть экземпляр самого себя, что произойдет, когда вы попытаетесь создать первый экземпляр? Он создает вложенный экземпляр, а затем он создает вложенный экземпляр. Когда это остановится?