2013-10-21 77 views
0

我有一個最佳擬合算法的代碼。我想嘗試使用運算符new的最佳擬合算法。在C++中重載新運算符

每次創建一個對象我應該從已分配存儲器給它說,分別

1] 20 2] 12 3] 15 4] 6 5] 23。其中最小的數量適合對象的大小(例如21)

我想爲不同的對象類型做它,所以我需要編寫重載操作符new來作爲所有類對象的通用功能。

我可以通過朋友功能嗎,或者有什麼可行的辦法。

+0

您可以覆蓋全局新操作符,也可以重新查找放置位置。 – legends2k

+0

在[C++ - faq](http://stackoverflow.com/questions/tagged/c++-faq)中有一些很好的信息:[Overloading new and delete](http://stackoverflow.com/questions/4421706/運算符重載/ 4421791#4421791) –

回答

1

如果你想使用運營商的新的程序中的所有類型只需覆蓋全局operator new:

void* operator new (std::size_t count); 
void* operator new[](std::size_t count); 
void* operator new (std::size_t count, const std::nothrow_t&); 
void* operator new[](std::size_t count, const std::nothrow_t&); 

如果你想只對某些類別做它,你有2種可能:

使用放置new運算符:

void* operator new (std::size_t, void* ptr); 
void* operator new[](std::size_t, void* ptr); 

你將不得不與類型明確使用它,或者你可以使用工廠或工廠方法來創建CLASSE的情況下,並在堆內隱藏該實現。

您可以覆蓋新的運營商使用它作爲一個靜態方法類:

class FooBar { 
public: 
    static void* operator new (std::size_t count); 
    static void* operator new[](std::size_t count); 
}; 

然後就是重載運算符將被用來創建類的實例。

+0

[運算符新重寫始終是靜態的](http://stackoverflow.com/a/5406262/183120),因此您可以安全地移除靜態。 – legends2k

+0

@ legends2k謝謝,但我認爲在某些情況下顯示明確不會傷害(就像我們可以忽略派生方法的虛擬,但最好不要恕我直言) – Slava