班级成员的独特性

时间:2016-10-09 06:37:14

标签: c++ class

C ++ newbie here,我希望我的类能够使用相同的构造函数参数为所有instatiation引用相同的对象(例如,如果对象已经存在,我实例化的新变量应返回现有对象而不是创建一个相同的价值)。 是否有语义方法可以做到这一点,或者是保持包含类中所有对象的静态向量的最佳方法,并检查构造函数中是否存在具有相同参数的对象?

1 个答案:

答案 0 :(得分:0)

如果你可以从参数创建一个哈希,你可以做一些类似的事情:

class YourClass
{
    static std::unordered_map< std::string, YourClass > s_instances; // You can use std::map as well

    static YourClass& 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;

YourClass& 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元素被移除和破坏。