2013-03-03 30 views
3

想象一下,我有一個龐大的數據結構,比如說一個巨大的數據結構vector,其創建不受我控制(即我無法修改其靜態類型),其中包含InitialFunctionality類的對象。在C++:結構化對象的高性能修飾器模式

class InitialFunctionality 
{ 
public: 
void iCanDoThis(); 
} 

hugeVector vector<InitialFunctionality>; // <- lots of elements inside! :) 

我的目標是動態hugeVector最低的性能影響可能延長InitialFunctionality對象的功能,讓我們說:

class ExtraFunctionality: public InitialFunctionality 
{ 
public: 
int iOfferThisToo; 
} 

知名Decorator pattern作品非常適合非結構化的對象。您可以使用它來動態擴展InitialFunctionality類中的對象的功能,並愉快地將它們傳遞給後續用戶。

但如何在hugeVector對象延伸,而不改變其順序與最小的性能影響?例如,由於它的大小,複製矢量是一個不行。

我正在考慮使用某種Adapter作爲向量,該向量保留對原始的hugeVector的引用,並根據需要(即在訪問適應的向量元素時)對所包含的對象進行延遲轉換。然而,除了轉換本身(即初始化iOfferThisToo),它是由任何方法所需要,這需要保持一個高速緩存來檢查對象是否已經轉化或沒有。這種緩存可能非常昂貴。

+0

是'你的控制之下InitialFunctionality'? – 2013-03-03 13:31:30

+0

@AndyProwl假設你的意思是'InitialFunctionality'的定義:不,它不在我的控制之下。否則,我將能夠在那裏添加我的額外功能。這在設計方面可能被認爲是醜陋的,但在我看到的性能方面會很好。 – fons 2013-03-03 13:36:32

回答

-1

如果您沒有添加額外的成員,你應該能夠做這樣的事情:

class myInternalFunctionality : public InternalFunctionality { 
public: 
    //new features 
    void ICanDoThis(); 

private: 
    // disable all ctors 
}; 

,然後重鑄指針指向InternalFunctionality的載體。

myInternalFunctionality* myInternalPtr = &hugeVector[i]; 
myInternalPtr->ICanDoThis(); 

因爲你是我認爲你有一些麻煩。

+0

你能詳細說明一下嗎?對於初學者,我沒有看到'InternalFunctionality'如何添加我的額外數據成員'iOfferThisToo'。假設沒有額外的轉換隱含,你的解決方案只是不正確的(和危險的!),因爲沒有分配給'myInternalFunctionality'中出現的額外成員而不出現在'InternalFunctionality'中 – fons 2013-03-03 13:55:23

+0

我沒有說這是個好主意,你沒有說有多餘的成員。類的存儲與結構基本相同,所以如果你想簡單地添加方法,這是有效的。 – 2013-03-03 13:59:55

+0

我確實說過有額外的成員,'iOfferThisToo' **是**在我的問題中的成員。請仔細閱讀。另外,添加虛擬方法時,有關存儲的聲明也不正確。 – fons 2013-03-03 14:48:52