【问题标题】:How to overload global new operator如何重载全局new操作符
【发布时间】:2013-05-29 14:52:24
【问题描述】:

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

  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 来确定创建哪个对象是可以的,因为 key 确定对象的类型(从 Base 派生)但也许有更好的方法。

我也对任何其他设计模式持开放态度。

【问题讨论】:

  • 在现有对象之上构建对象是一个非常糟糕的主意。您可能根本不应该尝试使用 new 语法。只需让用户致电BaseFactory::GetInstance(k)Base::Get(k)
  • 这是单例模式主题的变体。但是,您可能不想丢弃现有密钥条目中的任何内容。您想使用它而不是创建一个新条目(因为它已经构建好了)。我认为您在错误的地方解决问题。

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


【解决方案1】:

在表达式new Derived(1) 中,1Derived 的构造函数的参数,而不是operator new 的参数。语言就是这样,抱歉。

【讨论】:

  • 所以没有办法像我写的那样做?
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多