何时向前声明不够

When is forward declaration not enough?

本文关键字:不够 声明 何时      更新时间:2023-10-16

#include问题

class widget { };
class fubar : public widget { // 1
    void value_parameter(widget); // 2    
    void ref_parameter(widget &); // 3
    void ptr_parameter(widget *); // 4
    virtual void value_parameter(widget); // 5
    virtual void ref_parameter(widget &); // 6
    virtual void ptr_parameter(widget *); // 7
    widget value_return(); // 8
    widget & ref_return(); // 9
    widget * ptr_return(); // 10
    widget instance_value_member; // 11
    widget & instance_ref_member; // 12
    widget * instance_ptr_member; // 13
    static widget static_value_member; // 14
    static widget & static_ref_member; // 15
    static widget * static_ptr_member; // 16
};

其中哪个需要A包含?(#include "widget.hpp"(

Widget的完整定义是:

  • #1(class fubar : public widget(,我们需要基类定义。
  • #11(widget instance_value_member;(,我们需要成员定义。

正向声明对其他人就足够了。

无。

class widget { };定义a 完整类型

如果您写了class widget;,即A 正向类声明,那将是另一回事。然后,鉴于由于继承而需要完整的类型,因此函数不需要进一步的#include

我认为您的意思是向前声明

class widget;

而不是定义

class widget { };

在这种情况下

class fubar : public widget { // 1

需要窗口小部件的完整类型定义。否则,fubar类的大小将是未知的。

除此行以外,所有其他声明不需要竞争类型的小部件的定义

widget instance_value_member; // 11

考虑到静态数据成员可能具有不完整的类型,因为它们是类定义中的声明(除非用指定器constexpr声明它们(。因此,该行例如

static widget static_value_member; // 14

不需要窗口小部件的完整类型定义。

另外,您不得以以下方式过载成员函数

void value_parameter(widget); // 2    
void ref_parameter(widget &); // 3
void ptr_parameter(widget *); // 4
virtual void value_parameter(widget); // 5
virtual void ref_parameter(widget &); // 6
virtual void ptr_parameter(widget *); // 7

即将虚拟和非虚拟函数与相同的名称和参数列表超载。