2013-04-11 50 views
0

使用前向声明时,这些类型的类成员需要是指针。对于将所有类成员声明为指针,即使头文件中的头文件已包含在这些类中,您怎么看?这似乎很好一致,没有混淆。C++ - 类成员作为指针,即使它可以作为一个值类型?

+0

请注意,动态创建对象具有性能成本。小的对象,比如struct 2 int,最好保持价值。 – 2013-04-11 13:43:37

回答

0

这是一个坏主意。指针引入一个间接级别,使事情变得繁琐,不安全(至少如果你不使用智能指针)并且对性能有害。

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

0

如果您希望forward声明所有内容(也许是因为编译时间缩短)。

也许您应该阅读约Pimpl idiom。这是你想知道的。

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; 
} 

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

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