我在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允许检查传递的变量,但我认为这不一定会使设置布尔值变得更容易。
答案 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
执行,不方便吗?