11

Можно ли создавать классы, содержащие в качестве данных-членов объекты этого же класса, указатели/ссылки на такие объекты, их массивы?

Например:

class A
{
    A x;
    A* y;
    std::vector<A> v;
}; 
Harry
  • 221,325
flow
  • 289

3 Answers3

21

Объекты и массивы — нет, так как на момент объявления класс ещё не создан до конца, а потому неизвестно, сколько места требуется выделить для его экземпляров.

А указатели и ссылки — пожалуйста, ведь факт существования данного класса уже известен.

Arhadthedev
  • 11,528
15

Указатели - запросто. А вот представьте себе, сколько памяти займет ваш класс, описанный в вопросе. Ведь он содержит в себе x, который содержит в себе x, который содержит в себе... Ну, вы понимаете - бесконечная рекурсия без каких бы то ни было надежд на прекращение. Это так, самое простое объяснение, почему нельзя.

Указатели же - запросто. Это очень широко применяемый метод - указатель на себя - для списков, деревьев и т.п.

Harry
  • 221,325
4

Только если этот член статический, например:

class A
{
    static A a;
};
Asem
  • 865