如何重载全局新运算符

时间:2013-05-29 14:52:25

标签: c++ operator-overloading new-operator

在我的应用程序中,我想只保留给定键的给定类的一个对象。为此,我在Base类中覆盖了本地新运算符:

  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;
}

它工作正常,但我需要使用例如Base * b = new(1)Derived调用该函数, 虽然我想保持正常的语法,但它是Base * b = new Derived(1)。 我怎么能这样做,有可能吗?我想重载全局运算符可能会起作用,我试过

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

但它不起作用。 现在我也正在使用键来确定哪个对象可以创建哪个是好的,因为key确定了对象的类型(从Base派生)但也许有更好的方法。

此外,我对其他任何模式都持开放态度。

1 个答案:

答案 0 :(得分:1)

在表达式new Derived(1)中,1Derived的构造函数的参数,而不是operator new的参数。这就是语言的用法,对不起。