Я использовал структуру данных LRU в main (), такую как следующее.
int main()
{
load_parameter();
cache::lru_cache<int, float> states_action0(STATES_NO_LRU);
cache::lru_cache<int, float> states_action1(STATES_NO_LRU);
cache::lru_cache<int, float> states_action2(STATES_NO_LRU);
.........
}
Обратите внимание, что STATES_NO_LRU является переменной целочисленного типа, которая загружается в начале main ().
Однако я хотел бы переместить объявление структуры данных LRU за пределы main (), чтобы объявить его как глобальный тип.
В области глобальной декларации STATES_NO_LRU не может быть загружен.
Как в этом случае работать с переменной STATES_NO_LRU?
Подводя итог, я хотел бы использовать lru_cache в качестве глобальной структуры данных.
Исходный код (часть заголовка) lru_cache выглядит следующим образом
namespace cache {
template<typename key_t, typename value_t> class lru_cache { public:
typedef typename std::pair<key_t, value_t> key_value_pair_t;
typedef typename std::list<key_value_pair_t>::iterator list_iterator_t;
lru_cache(size_t max_size) :
_max_size(max_size) {
}
Это звучит так, как будто вы ищете шаблон дизайна синглтона. Это способ получить единственный экземпляр класса из любого места в приложении.
class Singleton {
private:
// Let's prevent any other instances of this object
// by making the constructor private
Singleton()
: states_action0(STATES_NO_LRU) // Here we initialize states_action0 to STATES_NO_LRU
{
}
// This member will be accessible everywhere and only has one instance
cache::lru_cache<int, float> states_action0;
// You could also put states_action1 here too.
public:
static Singleton& GetInstance() {
static Singleton theSingleton;
return theSingleton;
}
// For read-only access make this const
lru_cache& GetCache() {
return states_action0;
}
};
Тогда вы будете использовать его в любом месте вашего приложения:
int main() {
cache::lru_cache& states_action0 = Singleton::GetInstance().GetCache();
}
В настоящее время, когда ваш объект кэша создается, вы передаете соответствующие аргументы. Это означает, что вам нужно знать, какими должны быть аргументы его конструктора при создании объектов.
C ++ инициализирует объекты со статическим временем жизни в 2 этапа:
Статическая инициализация (приблизительно: константы, известные во время компиляции, например int var= 42;
в пространстве имен)
Динамическая инициализация (примерно: некоторый код должен быть запущен для их инициализации, например int var2 = foo()
в пространстве имен)
В основном это означает, что вы должны сделать одну из нескольких вещей:
Это подход, который я бы порекомендовал вам. На самом деле это два разных решения, одно с указателями, а другое с поздней инициализацией уже созданного объекта, но оба имеют одинаковую идею, поэтому я объединю их в одну группу. Я рассмотрю только вариант указателя, другой должен быть легким для подражания.
Что бы это значило, это объявить lru_cache
в качестве указателя, а не по значению. Позже вы будете динамически создавать объект всякий раз, когда вы загрузите необходимые данные.
Решение Pointer будет выглядеть примерно так:
size_t load_parameter() {
//do magic;
return 42;
}
std::unique_ptr<lru_cache<int, float>> states_action0 = nullptr;
int main()
{
size_t STATES_NO_LRU = load_parameter();
states_action0 = std::make_unique<lru_cache<int, float>>(STATES_NO_LRU);
}
Решение для поздней инициализации построит по умолчанию lru_cache
объект и реализовать lru_cache::initialize(size_t maxSize)
метод для инициализации объекта.
load_paramter()
, позвоните и сохраните результаты в локальной статической.lru_cache
объект с локальной статической и вернуть его.Я настоятельно советую против такое решение. Время, в которое произойдет ваша загрузка, определяется реализацией, и, скорее всего, это произойдет до вызова main. Это будет выглядеть примерно так:
size_t load_parameter() {
//do magic;
return 42;
}
lru_cache<int, float> cacheMaker()
{
static size_t STATES_NO_LRU = -1;
if (STATES_NO_LRU == -1)
{
STATES_NO_LRU = load_parameter();
}
return lru_cache<int, float>(STATES_NO_LRU);
}
lru_cache<int, float> states_action0 = cacheMaker();
int main()
{
}