2015-03-13 3 views
0

Я работаю с огромным проектом, написанным на C++ (moses, smt translation). Ситуация заключается в том, что она хранит начальные настройки в нестатическом классе под названием «StaticData» со статическим полем «экземпляр» (StaticData.h). Любой другой класс использует «StaticData.GetInstance()» для доступа к текущим параметрам модели smt. Теперь возникает вопрос: что бы вы сделали, чтобы использовать несколько (по крайней мере двух) экземпляров класса StaticData с минимальным изменением кода? Может быть, есть какой-либо способ изолировать часть кода, выполняемую как AppDomain в C#?Несколько экземпляров статического класса в одном процессе в C++

+1

Похоже 'StaticData' класс синглтон. –

+3

Поздравляем! Вы обнаружили, почему одиночные игры плохие. –

+0

@JohnDibling, да. В этот момент единственный способ загрузить и использовать две модели (означает два экземпляра StaticData) - запустить два процесса. И я ищу способ сделать это в рамках одного процесса. –

ответ

0

Как насчет:

#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; 
} 
+0

Проблема в том, что существуют десятки других классов, использует StaticData.GetInstance - я не могу их исправить. –

+0

Простое изменение: 'GetInstance() {return CreateState (1); } ' –

Смежные вопросы