2014-02-06 67 views
-2

我的頭文件如下所示。現在有關內存優化的問題C++

class A; 
class B; 
class C; 

Class a { 
    A *a; 
    B *b; 
    C *c; 
}; 

Class a不使用所有ABC和周圍40人。我有大約40個前向聲明...可以優化它的某人..所以,我可以在需要的基礎上聲明指向類的指針,而不是浪費所有指向全部40個奇怪類的內存的內存?

+0

你可能想看看在你的設計,也許有一類樹與鹼性或抽象'了'類和繼承的孩子,只包含數據需要?或者,如果行爲更依賴於包含的數據,而不是那麼多(或沒有)共同,那麼只是一組單獨的類。 –

回答

2

可以使用聯合與類型代碼或升壓::變種

1

我建議現在,你應該做一個父類,並把兒童所有的A,B,C,等...然後,在類中使用父類的列表,並把它需要的任何子類。但是有這個問題實際上是由於錯誤的面向對象設計。在Java中學習一個系統的OO設計的原則,然後將它們用於C++。

0

承認你不能返工你的類,並承認使用的是隻有一個的時候,你可以使用一個工會加上一個ID或「動態類型無效*」:

unsigned gen_id() 
{ static unsigned id=0; ++id; return id; } 

template<class T> 
unsigned id_of() 
{ static id = gen_id(); return id; } 

class a 
{ 
    void* m; 
    unsigned type; 

public: 
    template<class T> 
    a(T* p) :m(p), type(id_of<T>()) 
    {} 

    template<class T> 
    T* get() const 
    { return (id_of<T>()==type)? static_cast<T*>(m): nullptr; } 
}; 

您可以訪問數據as

A* pa = my_a.get(); 
if(pa) { /* what has to be done with A */ } 

如果您需要多於一個,請考慮一個擁有a向量的類b。

對於更「規範」的實施,你可以看看boost::any

+1

確實,Boost Variant – sehe

+0

@sehe:好點! –