将成员变量定义为指针或对象

时间:2014-12-03 19:47:26

标签: c++

说我有两个班级:

" A.H"

#include "B.h"

class A
{
public:
    unique_ptr<B> b; //store as pointer
    B b; //store as object

    A() : b(new B())
    {

    }
}; 

&#34; B.h&#34;

class B
{
public:
    //huge class

    void foo() {};
};

我想在主要使用A:
&#34;的main.cpp&#34;

#include "A.h"
int main()
{
    unique_ptr<A> a(new A());
    a->b->foo();
    a->b.foo();
}

问题1:在存储和使用B作为指针而不是A中的对象时,我是否会获得性能提升? 问题2:说我在&#34; A.h&#34;中没有#included B但相反,我会向前宣布B:

class B;

然后,在主内部我不能调用a-&gt; b-&gt; foo(),因为B不包含在任何地方。什么是更好的设计,包括&#34; B.h&#34;在&#34; A.h&#34;或将其包含在&#34; main.cpp&#34;我实际上在哪里使用这个功能?包括在&#34; A.h&#34;会违反前瞻性规则宣布实际使用的所有内容,但将其包含在&#34; main.cpp&#34;对于使用这些类的程序员来说很糟糕。我真的有复杂的类,我想避免任何可能的#include,以避免以后出现混乱。

1 个答案:

答案 0 :(得分:1)

1)是的,A对象会更小,因为它只是指向B而不是携带B的副本

2)您可以在B转发声明A,只需#include "B.h" main.cpp main。实际上(如在大型程序中),您只需将此标头包含在使用标头的实际文件中,而不是{{1}}本身。将它包含在您使用它的地方,不要害怕包含东西。显然要将它保持在所需的最小头数,但不要因为避免包含而变得复杂。