初始化与枚举相关的值的最佳方法是什么?

时间:2013-11-26 14:50:34

标签: c++ enums

在一个类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可以改变。

1 个答案:

答案 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