Почему класс допускает статический член сам по себе, но не нестатический член?
class base {
public:
base a;
};
Он дает ошибку компиляции.
class base {
public:
static base a;
};
тогда как этот код не дает ошибки компиляции
Ответ 1
Потому что члены класса static не хранятся в экземпляре класса, поэтому static будет работать.
Сохранение объекта внутри другого объекта того же типа приведет к поломке среды выполнения - бесконечный размер, правильно?
Что вернет sizeof? Размер объекта должен быть известен компилятору, но поскольку он содержит объект того же типа, это не имеет смысла.
Ответ 2
Я предполагаю, что ошибка похожа на
Поле
'имеет неполный тип
Это связано с тем, что, когда не статично, класс A не полностью определен до закрытия фигурной скобки. С другой стороны, переменные статического члена нуждаются в отдельном шаге определения после полного определения класса, поэтому они работают.
Найдите разницу между декларацией и определением для более подробных объяснений.