У меня есть около 20 частных bools в классе в C ++.
Я хотел бы, чтобы они были общедоступными с использованием (публичной) функции.
Можно ли передать имя (частной) переменной в качестве аргумента такой функции?
Например,
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
of varnames позволил бы проверять переданные переменные, но я не думаю, что это обязательно облегчит установку логического значения.
Вы можете использовать std::map<std::string, bool>
хранить bool
ценности. Затем,
void setTrue(std::string varName)
{
// Add some checks to make sure that varName is valid.
varNames[varName] = true;
}
Если список этих переменных не изменится, я могу предложить вам использовать перечисление и переопределить оператор индекса:
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];
}
Он не расширяемый во время выполнения, но обеспечит вам лучшую безопасность во время компиляции, чем карты.
Ваше второе решение — путь сюда, однако я думаю, что Корпус переключателя не уменьшает LOC, помимо того факта, что это не будет работать с `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
ссылка.
Двадцать 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
удобно, не так ли?