2012-01-01 2 views
2

Я не понимаю, почему я получаю ошибку компиляции при попытке скомпилировать это:Компилятор ошибок при переопределении оператора нового

void* MemoryManagedObject::operator new(size_t size, bool UseMemPool) 
{ 
    Engine* engine = Engine::GetEngine(); 
    void* alloc; 

    alloc = engine->GetMemoryManager()->Allocate(size, UseMemPool); 

    if (alloc && UseMemPool) 
     mAllocatedWithMemPool = true; 

    return alloc; 
} 

Он говорит: «недопустимое использование член MemoryManagedObject :: mAllocatedWithMemPool в статической функции-члена».

В принципе, у меня есть флаг, который указывает, использовал ли я свой пул памяти или просто malloc() при распределении экземпляра класса, и я хочу установить его, когда я переопределяю «новый».

Я полагаю, что новый метод должен быть возвращен, прежде чем вы сможете использовать экземпляр класса? Есть ли способ обойти это?

EDIT: Просто интересно, ss этот код является допустимым решением?

void* MemoryManagedObject::operator new(size_t size, bool UseMemPool) 
{ 
    Engine* engine = Engine::GetEngine(); 
    MemoryManagedObject* alloc; 

    alloc = (MemoryManagedObject*)engine->GetMemoryManager()->Allocate(size, UseMemPool); 

    if (alloc && UseMemPool) 
     alloc->mAllocatedWithMemPool = true; 

    return alloc; 
} 
+0

Ну, чтобы ответить на ваш прямой вопрос: вы получаете ошибку компилятора, потому что 'operator new' является статической функцией. –

+0

Это не значит, что метод 'new' должен возвращаться, это значит, что экземпляр класса должен * существовать *. Похоже, вам не нужен «оператор новый», а класс-оболочка. –

+0

Распределитель должен выделять память, а не строить какие-либо объекты. Таким образом, он должен возвращать 'void *', и вы не можете иметь доступ, как 'alloc-> mAllocatedWithMemPool'. Конструктор объекта будет вызываться позже в возвращаемой памяти. –

ответ

3

Каждая перегрузка для operator new()operator delete()) неявно и автоматически объявляется static. Это специальное правило в C++.

Таким образом, вы должны создать свой класс таким образом, что конструктор может также вспомнить, как это было выделено, если вам нужно сохранить эту информацию:

Foo * p = new (true) Foo(true); 

То есть, ваш класс будет выглядеть следующим образом:

class Foo 
{ 
    bool mAllocatedWithMemPool; 
public: 
    static void * operator new(std::size_t n, bool usePool); 
    static void operator delete(bool) throw(); 
    explicit Foo(bool usePool); 
    /* ... */ 
}; 

Обратите внимание, что вы должны всегда объявить соответствующий delete оператора, даже если его использование весьма ограничено.

+0

Обновлен мой вопрос – KaiserJohaan

3

Эта ошибка в основном говорит о том, что вы не можете использовать член своего класса в статическом методе.
Переменная-член связана с экземпляром, который содержит его (ваш «этот» указатель). Статический метод не связан с экземпляром вашего класса (который делает его «статическим». Он относится ко всем экземплярам класса yoir.)
Когда вы пытаетесь использовать переменную-член в статическом методе, компилятор не может знать к какому экземпляру вашего класса принадлежит эта переменная-член, потому что метод принадлежит всем им.

+0

Обновлено мой вопрос – KaiserJohaan