объявление класса делает класс неполным типом, поэтому ни один объект класса не может быть определен. И определение неполного типа состоит в том, что его член не указан. Разве это не означает, что класс с пустым телом без члена, указанного в его определении, делает его неполным типом?
class Empty { };
Empty e1; // okay, but why?
Является ли класс с пустым телом неполным типом?
Нет, класс с пустым телом — это просто пустой класс, но все же полностью определенный. Неполный тип — это тип, полное определение которого не отображается.
class Empty;
// Here, Empty is an incomplete type
class Empty { };
// Here, Empty is a complete type
В соответствии с пунктом 3.9 / 5 стандарта C ++ 11:
Класс, который был объявлен но не определено, или массив неизвестного размера или неполного типа элемента, является
не полностью определенный тип объекта. Не полностью определенные типы объектов и типы void являются неполными
типы (3.9.1). Объекты не должны быть определены, чтобы иметь неполный тип.
Кроме того, в соответствии с пунктом 9.2 / 2:
Класс считается полностью определенным типом объекта (3.9) (или завершенным типом) при закрытии
}
спецификатора класса. […]
Как уже говорили другие, это не неполный тип. В C ++ бывают моменты, когда такие вещи желательны.
Учтите следующее:
template<class T>
class Field
{
public:
virtual std::string toString() const = 0;
};
Как я могу сохранить это в коллекции? Ответ не могу. Но я мог бы сделать:
class FieldBase
{
public:
virtual ~FieldBase() = 0 { }; // virtual destructor needed, but no other members
virtual std::string toString() const = 0;
};
Технически, это не имеет каких-либо членов, определенных в соответствии с вашим вопросом. Это абстрактно. Это не может быть создано. Но теперь мы можем сделать:
template<class T>
class Field : public FieldBase
{
virtual std::string toString() const { /* ... */ };
};
Я знаю, что это немного отличается от вашего первоначального вопроса, но это иллюстрирует, что базовый класс не имеет ничего определенного (кроме намерения), и теперь мы можем хранить эти классы-шаблоны в std::vector<FieldBase*>
коллекция.
Да, это полный тип. Когда я последний раз проверял размер был один байт (по крайней мере на компиляторе MS).
Чтобы создать неполную структуру, опустите скобки:
struct Empty;
Это также называется заранее объявленной структурой и не является определением структуры.