Почему классу разрешено иметь статический член, но не нестатический член? - PullRequest
26 голосов
/ 15 декабря 2011
class base {
public:
    base a;
};

Это дает ошибку компиляции.

class base {
public:
    static base a;
};

, тогда как этот код не дает ошибку компиляции

Ответы [ 2 ]

41 голосов
/ 15 декабря 2011

Поскольку static члены класса не хранятся в экземпляре класса, поэтому static будет работать.

Хранение объекта внутри другого объекта того же типа нарушит время выполнения - бесконечный размер,верно?

Что вернет sizeof?Размер объекта должен быть известен компилятору, но поскольку он содержит объект того же типа, это не имеет смысла.

6 голосов
/ 15 декабря 2011

Я предполагаю, что ошибка что-то вроде

поле "а" имеет неполный тип

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

Найдите разницу между объявлением и определением для более подробных объяснений.

...