#c #class
#c #класс
Вопрос:
Новичок в C здесь я хочу, чтобы мой класс ссылался на один и тот же объект для всех установок с одним и тем же параметром конструктора (например, если объект уже существует, новая переменная, которую я создаю, должна возвращать существующий объект, а не создавать его с тем же значением). Есть ли семантический способ сделать это, или лучше всего сохранить статический вектор, который содержит все объекты в классе, и проверить в конструкторе, существует ли он с теми же параметрами?
Комментарии:
1. Вам нужно
Singleton class
: yolinux.com/TUTORIALS/C Singleton.html или погуглите это!2. Найдите шаблон singleton.
3. Это не синглтон, если их много…
Ответ №1:
Если вы можете создать хэш из параметров, вы можете сделать что-то подобное:
class YourClass
{
static std::unordered_map< std::string, YourClass > s_instances; // You can use std::map as well
static YourClassamp; get_instance( paramtype1 param1, paramtype2 param2 );
static std::string create_hash( paramtype1 param1, paramtype2 param2 );
// The implementation depends on the type of parameters
};
std::unordered_map< std::string, YourClass > YourType::s_instances;
YourClassamp; YourClass::get_instance( paramtype1 param1, paramtype2 param2 )
{
auto hash = create_hash( param1, param2 );
auto it = s_instances.find( hash );
if ( it == s_instances.end( ) )
{
return it->second;
}
else
{
s_instances[ hash ] = YourType( param1, param2 );
return s_instances[ hash ];
}
}
Естественно, есть множество вопросов, на которые вы должны ответить:
1. Должна ли эта операция быть потокобезопасной? Т.е. Может быть доступ несколькими потоками параллельно или нет? Если да, вы должны защитить s_instances
от параллельной модификации.
- Как будет выглядеть фаза уничтожения? Статические члены уничтожаются в порядке, обратном порядку создания, и их очень сложно контролировать, когда они выполняются. Это означает, что возможно, что какой-то ресурс уже уничтожен, который необходим в деструкторе
YourClass
. Из-за этого я предлагаю некоторую фазу контролируемого уничтожения, когдаs_instances
элементы удаляются и уничтожаются.