在我的應用程序中,我只想用給定的鍵只保留給定類的一個對象。要做到這一點我在課堂上基本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模式開放。
在現有對象之上構建對象是一個非常糟糕的主意。你可能不應該試圖使用'new'語法。只需讓用戶調用'BaseFactory :: GetInstance(k)'或'Base :: Get(k)'。 – aschepler
這是一個Singleton模式主題的變體。但是,您可能不想丟棄鍵的現有條目中的任何內容;你想使用它而不是創建一個新的條目(因爲它已經構建)。我認爲你是在錯誤的地方解決問題。 –