0

使用前向声明时,这些类型的类成员需要是指针。您如何看待将所有类成员声明为指针,即使头文件中已包含这些类的头文件?这看起来非常一致,没有混淆。

4

2 回答 2

0

这是个坏主意。指针引入了一定程度的间接性,使事情变得繁琐、不安全(至少在您不使用智能指针的情况下)并且对性能有害。

一般来说,你应该正确地包含标题,这样你就不会遇到这个问题,除非有其他原因需要使用指针(在相互依赖的情况下,有这个需要,所以使用它们是不可避免的作为成员,因此显然是“好的”)。

于 2013-04-11T13:27:47.653 回答
0

假设你有一个 A 类,像这样:

class    A
{
    public:
        B      my_b_member;
};

需要这个B类:

class    B
{
    public:
        int    my_integer;
};

当然,类 A 将需要 B 的整个定义,至少描述 B 的构造函数的部分。为什么 ?当您声明您的 A 类时,它的成员之一(即 B)也将被实例化,使用其默认构造函数(不带参数)。因此,项目中需要 A 类的每个类或文件之前也必须包含 B 类定义。

拥有这样的 A 类的最大优势是:

class    A
{
    public:
        B*      my_b_member;
};

是您只需要声明一个B 类存在,其中:

class B;

在 A 的定义之前。

唯一需要 B 的完整定义的文件是包含 B 的类实例化的文件,例如:

int main(void)
{
       A    a;

       a.my_b_member = new B;
       return 0;
}

所以这取决于你的项目,你想要实现的目标等等。我不会说每个类成员必须是指针,因为必须通过分配它们来实例化你的类包含的每个成员意味着这些成员将被分配堆,而不是堆栈。在某些情况下,您不希望这种情况发生:

当您操作网络块时,发送指针是不可能的。

于 2013-04-11T13:40:54.210 回答