Моя игра Движок имеет 2 распределителя: куча и стек.
class GameEngine{public:
Allocator* heap; //<-- a custom allocator class
Allocator* stack;
}
Сегодня я хочу создать класс Car , которому требуется распределитель кучи.
class Car{
MyArray<Car*> nearEnemyCache; //<-- my custom storage, need allocator
};
Таким образом, чтобы создать экземпляр автомобиля, я вырываю распределитель кучи из engine и назначаю его на car .
class CarFactory{
GameEngine* gameEngine;
Car* createCar(){
Car* car=new Car();
car->nearEnemyCache.setAllocator( gameEngine->heap );
return car;
}
};
Вот диаграмма: -
Задача
Если класс car
растет и имеет много полей, которые требуютallocator: -
class Car{
MyArray<Car*> nearEnemyCache; //<-- need allocator
class A{ };
MyArray<A> as; //<--- need allocator
class B{};
MyUnorderMap<B> bs; //<--- need allocator
};
Мне придется присваивать им распределитель, один за другим вручную.
Это приводит к грязному коду.
Car* createCar(){
Car* car=new Car();
car->nearEnemyCache.setAllocator( gameEngine->heap );
car->as.setAllocator( gameEngine->heap );
car->bs.setAllocator( gameEngine->heap ); //<-- so dirty & tedious
return car;
}
My Poor Solutions
Оба решения используют глобальную переменную в качестве распределителя по умолчанию , прямо или косвенно.
Я считаю, что использование глобальной переменной, как правило, плохопрактика.
1.глобальный распределитель по умолчанию
Установите глобальный распределитель в начале программы и используйте его по умолчанию, например: -
Allocator* defaultAllocator;
template<class T>MyArray{
Allocator* allocator=defaultAllocator;
//... other stuffs
}
int main(){
//create "gameEngine"
defaultAllocator=gameEngine->heap;
// start game
}
2.глобальная переменная игрового движка.
GameEngine* defaultGameEngine;
template<class T> class MyArray{
Allocator* allocator=defaultGameEngine->heap;
//... other stuffs
}
int main(){
//create "gameEngine"
defaultGameEngine=gameEngine;
// start game
}
Подобные вопросы: -