C ++中同一进程中的多个静态类实例

Posted

技术标签:

【中文标题】C ++中同一进程中的多个静态类实例【英文标题】:Multiple instances of static class in same process in C++ 【发布时间】:2015-03-13 18:47:09 【问题描述】:

我正在处理一个用 C++ 编写的大型项目(moses,smt 翻译)。情况是它将初始设置存储在名为“StaticData”的非静态类中,静态字段为“instance”(StaticData.h)。任何其他类都使用“StaticData.GetInstance()”来访问当前的 smt 模型设置。现在的问题是:您将如何使用多个(至少两个)“StaticData”类实例而代码更改最少?可能有什么方法可以隔离部分代码执行,如 C# 中的 AppDomain?

【问题讨论】:

听起来StaticData 是一个单例类。 恭喜!您已经发现了单身人士为何不好。 @JohnDibling,是的。此时加载和使用两个模型(意味着两个“StaticData”实例)的唯一方法是运行两个进程。而且我正在寻找在单个进程中执行此操作的方法。 简短的回答是@NeilKirk 是对的。稍微长一点的答案是取消单例,单例将非常困难和麻烦。 @JohnDibling,我明白了。 C++ 感知解决方案,某种沙盒代码执行怎么样? 【参考方案1】:

怎么样:

#include <unordered_map>
#include <memory>

using namespace std;

class StaticData 
public:
   static StaticData* CreateState(unsigned int id) 
      static unordered_map<unsigned int, unique_ptr<StaticData> > states;
      auto i = states.find(id);
      if (i != states.end()) 
     return i->second.get(); 
       else 
     states.insert(make_pair<unsigned int, unique_ptr<StaticData> >(
              static_cast<unsigned int>(id), unique_ptr<StaticData>(new StaticData())));
     return CreateState(id);
      
   
private:
   StaticData()
   
   

;

int main() 
   StaticData* s = StaticData::CreateState(123);
   StaticData* s2 = StaticData::CreateState(124);
   StaticData* s3 = StaticData::CreateState(123);
   if (s != s3) 
      return 1;
   
   return 0;

【讨论】:

问题是有几十个其他类使用 StaticData.GetInstance - 我不能全部修补它们 简单更改:GetInstance() return CreateState(1);

以上是关于C ++中同一进程中的多个静态类实例的主要内容,如果未能解决你的问题,请参考以下文章

Swift无法使用类型(实例)访问类中的静态变量

Java关键字-static

类中静态方法

在java中,为啥类实例也能访问静态域?

JNI/NDK开发指南——C/C++访问Java实例变量和静态变量

部分类静态类Object类ToString()方法扩展方法的使用