2014-12-03 62 views
0

说我有两类:定义的成员变量的指针或对象

“啊”

#include "B.h" 

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

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

    } 
}; 

“波黑”

class B 
{ 
public: 
    //huge class 

    void foo() {}; 
}; 

而且我想使用在主:
“main.cpp”

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

问题1:当存储和使用B作为指针而不是A中的对象时,会有什么性能提升吗?
问题2:在说“嗯”,我也不会执行#included B,而不是我会向前声明B:

class B; 

然后,主内我便无法称之为A-> B- > foo(),因为B不在任何地方。什么是更好的设计,包括“A.h”中的“B.h”或将其包含在“main.cpp”中,我在哪里实际使用该函数?将它包含在“A.h”中会破坏前向规则,声明所有未实际使用的规则,但将其包含在“main.cpp”中对于使用这些类的程序员来说是非常糟糕的。我真的有复杂的类,我想避免任何可能的#include,以避免以后的混乱。

+0

除非你需要用另一个对象替换'b'(即改变它指向的内容),那么在这里可能首选合成。很难说不知道设计的更多细节。 – 2014-12-03 19:51:42

回答

1

1)是的,一个A对象会更小,因为它只是一个指向B而不是围绕的B

复印件2携带),您可以转发在A声明B,你只需要#include "B.h"在您的main.cpp。在现实中(如在大型程序中),您只需将该标题包含在使用标题的实际文件中,而不是本身就是main。把它包括在你使用它的地方,不要害怕包括东西。显然保持它所需的最小数量的头,但不要变得复杂,只是为了避免包含。

+0

谢谢! 1)但是,因此,每次访问时必须对b进行解除引用。这不影响性能吗? – user3067395 2014-12-03 20:58:35

相关问题