В моем приложении я хочу сохранить только один объект данного класса с заданным ключом. Для этого я переопределил локального нового оператора в классе. База:Как перегрузить глобальный новый оператор
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);
}
но он не работает. Также прямо сейчас я использую ключ для определения того, какой объект создать, который в порядке, поскольку ключ определяет тип объекта (исходя из базы), но, возможно, есть лучший способ.
Также я открыт для любых других образцов десертов.
Построение объекта поверх существующего объекта - действительно плохая идея. Вероятно, вы не должны пытаться использовать синтаксис 'new' вообще. Просто попросите пользователей вызвать 'BaseFactory :: GetInstance (k)' или 'Base :: Get (k)'. – aschepler
Это вариант на тему шаблона Singleton. Однако вы, вероятно, не хотите выбрасывать все, что находится в существующей записи для ключа; вы хотите использовать это вместо создания новой записи (поскольку она уже построена). Я думаю, что вы решаете проблему не в том месте. –