2014-12-03 65 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

相關問題