2013-11-26 2 views
0

В одном классе Foo i have и enum OperatorsTypes. И метод, который используется для инициализации значений assutiatied с этим перечислением:Каков наилучший подход к инициализации значений, связанных с перечислением?

void InitializeOpTypesCC() 
{ 
    _operatorTypeContactCount[OperatorsTypes::CreateChannel] = 3; 
    _operatorTypeContactCount[OperatorsTypes::CreateOperator] = 1; 
    _operatorTypeContactCount[OperatorsTypes::DeleteChannel] = 2; 
    _operatorTypeContactCount[OperatorsTypes::Division] = 2; 
    _operatorTypeContactCount[OperatorsTypes::Equal] = 1; 
    _operatorTypeContactCount[OperatorsTypes::GetOperatorContactsCount] = 1; 
    _operatorTypeContactCount[OperatorsTypes::GetInputOperatorId] = 1; 
    _operatorTypeContactCount[OperatorsTypes::GetTypeOfOperator] = 1; 
    _operatorTypeContactCount[OperatorsTypes::If] = 2; 
    _operatorTypeContactCount[OperatorsTypes::IsChannelExists] = 3; 
    _operatorTypeContactCount[OperatorsTypes::Minus] = 2; 
    _operatorTypeContactCount[OperatorsTypes::Multiplication] = 2; 
    _operatorTypeContactCount[OperatorsTypes::One] = 0; 
    _operatorTypeContactCount[OperatorsTypes::Plus] = 2; 
    _operatorTypeContactCount[OperatorsTypes::RandomNumber] = 1; 
    _operatorTypeContactCount[OperatorsTypes::RemoveOperator] = 1; 
    _operatorTypeContactCount[OperatorsTypes::Time] = 0; 
    _operatorTypeContactCount[OperatorsTypes::Nothing] = 0; 
} 

Curently я звоню этот метод из конструктора. Но я от профилирования, что конструктор метода принимает segnificent tyme il общее время. Поэтому я хочу сделать эту инициализацию и static_operatorTypeContactCount. Не инициализировать его для всех экземпляров. Я отметил InitializeOpTypesCC и _operatorTypeContactCount со статикой и начал получать ошибки привязки. Я читал об этом предельном статическом. Затем я переместил _operatorTypeContactCount и InitializeOpTypesCC в область пространства имен и пометил его как статический. Это работает, но мне нужно вручную вызвать InitializeOpTypesCC и получить неопределенное поведение, когда я забыл, например, в модульных тестах. Каков наилучший способ в этом случае?

Это может быть константный статический массив, но мне нужно, чтобы инициализировать его по индексу, как: Const INT тест [] = { [ind1] = 10, [ind2] = 5, //. //. //. } ;. Не один за другим, как в const char Foo :: array [] = {'1', '2', '3'}; Это не удобно, потому что enume может измениться.

+0

http://stackoverflow.com/q/18784796/1175253 – Sam

+0

Ошибка статического члена класса + компоновщик: похоже, что вы только объявили этот элемент статическим в h-файле и не создали переменную в .cpp-файле. –

+0

Почему вы думаете, что инициализация 18 переменных занимает значительное количество времени? –

ответ

1
DependentType 
{ 
    static bool staticInit = false; 

    //**NOT** thread safe!! (you'd need a static sync primitive) 
    if(!staticInit) 
    { 
     staticInit = true; 
     DoStaticInit(); 
    } 
} 

или глобально:

bool StaticInit() 
{ 
    static bool staticInit = false; 

    //**NOT** thread safe!! (you'd need a static sync primitive) 
    if(!staticInit) 
    { 
     staticInit = true; 
     DoStaticInit(); 
     return true; 
    } 
    return false; 
} 

DependentType() 
{ 
    //Add this to all dependent type's constructor or class body 
    static const bool staticInit = StaticInit(); 
} 

Даже если вы бежите, что статические инициализации из другой статической инициализации, как только у вас есть статические экземпляры DependentType, это зависит от статического порядка инициализации, которое трудно прогнозировать и еще труднее поддерживать.

Другим способом может быть класс адаптера с итераторами и любым необходимым, чтобы обернуть статический массив:
Link two enumated type members.

+0

Спасибо. Но эта проверка будет иметь некоторые накладные расходы ... Я думаю, что будет лучше использовать статический член, некоторый класс, зоопарк с инициализацией массива _operatorTypeContactCount. –

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