在一个类Foo中我有和枚举OperatorsTypes。和用于初始化值的方法 对那个枚举感到满意:
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;
}
我可以从构造函数中调用此方法。但我从描述中得到了 方法构造函数采取segnificent tyme il一般时间。所以我想做到这一点 初始化和_operatorTypeContactCount静态。不为所有实例初始化它。 我用Static标记了InitializeOpTypesCC和_operatorTypeContactCount并开始得到 联系错误。我读到了静态的这个限制。然后我将_operatorTypeContactCount和InitializeOpTypesCC移动到命名空间范围并将其标记为静态。这工作但我需要manualy调用InitializeOpTypesCC并在我忘记时得到未定义的行为,例如在单元测试中。在这种情况下,最好的方法是什么?
这可以是const静态数组但我需要通过索引初始化它,如: const int test [] = { [ind1] = 10, [ind2] = 5, //。 //。 //。 } ;.不像const char Foo :: array [] = {'1','2','3'}一样一个接一个;这不方便,因为enume可以改变。
答案 0 :(得分: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();
}
即使你从另一个静态初始化运行静态init,只要你有DependentType
的静态实例,它就依赖于静态初始化顺序,这很难预测,甚至更难维护。
另一种方法是使用迭代器和任何需要的适配器类来包装静态数组:
Link two enumated type members