Задать вопрос
@semenyakinVS
Писатель кода и не только

Почему нельзя объявлять стековые объекты внешних классов для внутренних классов?

Для определённого кода есть необходимость использовать объекты внешнего класса для внутреннего класса.

Вот такое вот собирается:
Код который собирается
class Outer {
public:
	class Inner {
		Outer *_outer;
	public:
		Inner() : _outer(new Outer()) { }
	};

	Outer() { }
};



А вот такое нет:
Код который не собирается
class Outer {
public:
	class Inner {
		Outer _outer;
	public:
		Inner() : _outer() { }
	};

	Outer() : _inner() { }
};



Выдаёт ошибку: "field '_outer' has incomplete type"

Очень странно - ведь в обоих случаях нужен доступ к реализации конструктора. Почему в первом случае (при создании объекта на куче) это работает, а если делать его "не по указателю" - нет.

П.С.: Кстати, спрошу заодно: как правильно называть объекты, которые хранятся в каком-либо контексте не по указателю?

(edited): Поправил вопрос с учётом комментария AtomKrieg про рекурсию
  • Вопрос задан
  • 164 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@MiiNiPaa
Класс считается complete когда при его парсинге достинается закрывающая скобка. При объявлении вложенного класса внутри внешнего, он ещё не полон и объявить член его типа нельзя. Указатель на неполный тип создавать можно, поэтому первый вариант компилируется.

Поправить можно так:

struct Outer 
{
  struct Inner;
};

struct Outer::Inner 
{
    Outer _outer;
    Inner() : _outer() { }
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
В самом начале сделайте объвление:
class Outer;

class Outer {
private:
  class Inner {
    Outer _outer;
...

Может быть поможет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы