通过C ++中的公共函数创建可更改的私有变量列表

时间:2014-07-29 05:18:49

标签: c++ private-members public-method

我在C ++中的一个类中有大约20个私有bool。 我希望使用(公共)函数公开访问这些内容。

是否可以将(私有)变量的名称作为参数传递给这样的函数? 例如,

void setTrue(std::string varName)
{
    someFunctionToConvertStringToVariable = true;
}

或者,我认为

void setTrue(std::string varName)
{
    if (varName == "boolA")
    {
        boolA = true;
    }
    else if (varName == "boolB")
    {
        boolB = true;
    }
}

会起作用,可以使用switch(varName)来减少所需的LOC数量。

另一种选择可能是将所有布尔值公开,然后使用调用程序中的myClass.boolA = true;访问它们 - 我不确定这是最好的想法,但它肯定更简单,所以这是一个有利于它的论据。

是否有普遍接受/最佳方式来做这类事情?我是否刚刚设置问题并且有更聪明的方法来解决这个问题?也许enum个varnames允许检查传递的变量,但我认为这不一定会使设置布尔值变得更容易。

4 个答案:

答案 0 :(得分:3)

您可以使用std::map<std::string, bool>来存储bool值。然后,

void setTrue(std::string varName)
{
    // Add some checks to make sure that varName is valid.

    varNames[varName] = true;
}

答案 1 :(得分:2)

如果这些变量的列表不会改变,我可以建议你使用枚举和覆盖下标运算符:

enum MyBools
{
    First = 0,      
    BoolA = First,       
    BoolB,       
    //...
    Bool20,     
    Last = Bool20,
}    

class MyIndexedBools
{
private:
    bool m_Bools[MyBools::Last + 1];

public:
    bool& operator[] (MyBools index);
};

bool& operator[] (MyBools index);
{
    if (index < First || index > Last)
         throw "error";

    return m_Bools[index];
}

它在运行时不可扩展,但会比地图提供更好的编译时安全性。

答案 2 :(得分:0)

你的第二个解决方案是去这里的方式,但我认为切换案例不会减少LOC it won't work with an `std::string 之外的事实!

void setTrue(const std::string& varName)
{
    if (varName == "boolA")
    {
        boolA = true;
    }
    else if (varName == "boolB")
    {
        boolB = true;
    }
}

VS

void setTrue(const std::string& varName)
{
    switch(str2int (varName))
    {
    case str2int ("boolA"):
        boolA = true;
        break;
    case str2int("boolB"):
        boolB = true;
        break;
    default: 
        assert (false);
    }
}

请记住,如果您不想修改传递的参数,最好将其作为const传递!在这种情况下,我会亲自将其作为const参考传递。

答案 3 :(得分:0)

二十bool确实很多。

相反,我建议使用带有常量索引的bitset(例如使用enum)。假设C ++ 11:

class SomeClass {
public:
    enum class Flag: size_t {
        Flag1,
        Flag2,
        Flag3,
        ...,
        Flag20
    };

    bool get_flag(Flag f) const { return _flags.test(size_t(f)); }

    void set_flag(Flag f, bool value) { _flags.set(size_t(f), value); }

private:
    std::bitset<size_t(Flag20) + 1> _flags;
}; // class SomeClass

注意:所有超出范围的访问均由bitset执行,不方便吗?