2

类声明使类成为不完整的类型,因此不能定义类的对象。不完整类型的定义是它的成员没有被指定。这是否意味着具有空主体且其定义中未指定成员的类使其成为不完整类型?

class Empty { };

Empty e1; // okay, but why?
4

3 回答 3

4

一个空体的类是不完整的类型吗?

不,具有空主体的类只是一个空类,但仍然是一个完全定义的类。不完整类型是其完整定义不可见的类型。

class Empty;

// Here, Empty is an incomplete type

class Empty { };

// Here, Empty is a complete type

根据 C++11 标准的第 3.9/5 段:

已声明但未定义的类,或大小未知或元素类型不完整的数组,是未完全定义的对象类型。未完全定义的对象类型和 void 类型是不完全类型 (3.9.1)。对象不应被定义为具有不完整的类型。

此外,根据第 9.2/2 段:

在类说明符结束}时,类被认为是完全定义的对象类型 (3.9)(或完整类型)。[...]

于 2013-05-15T19:15:08.873 回答
1

正如其他人所说,它不是一个不完整的类型。在 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*>集合中。

于 2013-05-15T19:24:51.467 回答
0

是的,它是一个完整的类型。当我上次检查时,大小是一个字节(至少在 MS 的编译器上)。

为了创建一个不完整的结构省略你的大括号:

struct Empty;

这也称为前向声明结构,而不是结构的定义。

于 2013-05-15T19:15:53.417 回答