2013-05-29 41 views
0

在我的應用程序中,我只想用給定的鍵只保留給定類的一個對象。要做到這一點我在課堂上基本overrided當地新的運營商:如何重載全局新運算符

void * operator new(size_t size, int k) 
    { 
     return BaseFactory::GetInstance(k);  
    } 

這就要求BaseFactory的靜態方法。此方法具有類Base的現有對象的列表。如果已經存在具有相同鍵的對象,它返回它,如果不是創建新的對象

Base* BaseFactory::GetInstance(int k) 
{ 
for(vector<Base*>::iterator it = bases.begin(); it < bases.end(); it++) 
    if((*it)->key == k) 
     return *it; 
//else recognize which object to create on given key. just a simple example 
    Base *l = ::new Derived(k); 
bases.push_back(l); 
return l; 
} 

它工作正常,但我需要調用函數使用的實例庫* B =新的(1)派生, 雖然我想保持正常的語法,它是Base * b = new Derived(1)。 我該怎麼做,這可能嗎?我想超載全球運營商可能會工作,我試過

void *operator new (size_t size, Base& b, int key) 
{ 
return BaseFactory::GetInstance(key); 
} 

但它不起作用。 現在我正在使用鍵來確定哪個對象來創建哪個是好的,因爲鍵確定對象的類型(從Base派生),但也許有更好的方法。

此外,我對任何其他dessing模式開放。

+2

在現有對象之上構建對象是一個非常糟糕的主意。你可能不應該試圖使用'new'語法。只需讓用戶調用'BaseFactory :: GetInstance(k)'或'Base :: Get(k)'。 – aschepler

+0

這是一個Singleton模式主題的變體。但是,您可能不想丟棄鍵的現有條目中的任何內容;你想使用它而不是創建一個新的條目(因爲它已經構建)。我認爲你是在錯誤的地方解決問題。 –

回答

1

在表達式new Derived(1),所述1是一個參數的Derived構造,而不是operator new。這只是語言的方式,對不起。

+0

所以沒有辦法做到這一點,因爲我寫了它? – rank1