Можно ли создавать классы, содержащие в качестве данных-членов объекты этого же класса, указатели/ссылки на такие объекты, их массивы?
Например:
class A
{
A x;
A* y;
std::vector<A> v;
};
Можно ли создавать классы, содержащие в качестве данных-членов объекты этого же класса, указатели/ссылки на такие объекты, их массивы?
Например:
class A
{
A x;
A* y;
std::vector<A> v;
};
Объекты и массивы — нет, так как на момент объявления класс ещё не создан до конца, а потому неизвестно, сколько места требуется выделить для его экземпляров.
А указатели и ссылки — пожалуйста, ведь факт существования данного класса уже известен.
Указатели - запросто. А вот представьте себе, сколько памяти займет ваш класс, описанный в вопросе. Ведь он содержит в себе x, который содержит в себе x, который содержит в себе... Ну, вы понимаете - бесконечная рекурсия без каких бы то ни было надежд на прекращение. Это так, самое простое объяснение, почему нельзя.
Указатели же - запросто. Это очень широко применяемый метод - указатель на себя - для списков, деревьев и т.п.
class A;– nzeemin Apr 17 '16 at 14:48class A { std::vector<A> v; };компилируется? – flow Apr 17 '16 at 14:53A arr[10], а std:vector -- это не массив, а просто другой класс, манипулирующий экземплярами класса A. – nzeemin Apr 17 '16 at 14:55T1иT2справедливо равенствоsizeof(T1*) == sizeof(T2*). – αλεχολυτ Apr 17 '16 at 15:00