Уникальность в членах класса

#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 от параллельной модификации.

  1. Как будет выглядеть фаза уничтожения? Статические члены уничтожаются в порядке, обратном порядку создания, и их очень сложно контролировать, когда они выполняются. Это означает, что возможно, что какой-то ресурс уже уничтожен, который необходим в деструкторе YourClass . Из-за этого я предлагаю некоторую фазу контролируемого уничтожения, когда s_instances элементы удаляются и уничтожаются.