2013-05-29 5 views
0

В моем приложении я хочу сохранить только один объект данного класса с заданным ключом. Для этого я переопределил локального нового оператора в классе. База:Как перегрузить глобальный новый оператор

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

он отлично работает, но мне нужно вызвать функцию, используя, например, базы * б = новый (1) Derived , , в то время как я хотел бы сохранить обычный синтаксис, это Base * b = new Derived (1). Как я могу это сделать, возможно ли это? Я думаю, что перегрузка глобального оператора может работать, я пробовал

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

но он не работает. Также прямо сейчас я использую ключ для определения того, какой объект создать, который в порядке, поскольку ключ определяет тип объекта (исходя из базы), но, возможно, есть лучший способ.

Также я открыт для любых других образцов десертов.

+2

Построение объекта поверх существующего объекта - действительно плохая идея. Вероятно, вы не должны пытаться использовать синтаксис 'new' вообще. Просто попросите пользователей вызвать 'BaseFactory :: GetInstance (k)' или 'Base :: Get (k)'. – aschepler

+0

Это вариант на тему шаблона Singleton. Однако вы, вероятно, не хотите выбрасывать все, что находится в существующей записи для ключа; вы хотите использовать это вместо создания новой записи (поскольку она уже построена). Я думаю, что вы решаете проблему не в том месте. –

ответ

1

В выражении new Derived(1), то 1 является аргументом в конструктор Derived, чтобы не operator new. Это так, как это делает язык, извините.

+0

, так что нет способа сделать это, как я написал? – rank1

Смежные вопросы