2013-10-21 47 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