Является ли класс с пустым телом неполным типом?

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

class Empty { };

Empty e1; // okay, but why?

2

Решение

Является ли класс с пустым телом неполным типом?

Нет, класс с пустым телом — это просто пустой класс, но все же полностью определенный. Неполный тип — это тип, полное определение которого не отображается.

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) (или завершенным типом) при закрытии } спецификатора класса. […]

4

Другие решения

Как уже говорили другие, это не неполный тип. В 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*> коллекция.

1

Да, это полный тип. Когда я последний раз проверял размер был один байт (по крайней мере на компиляторе MS).

Чтобы создать неполную структуру, опустите скобки:

struct Empty;

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

0
По вопросам рекламы [email protected]