Сделать список приватных переменных, которые можно изменить с помощью публичной функции в Stack Overflow

У меня есть около 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 позволил бы проверять переданные переменные, но я не думаю, что это обязательно облегчит установку логического значения.

0

Решение

Вы можете использовать std::map<std::string, bool> хранить bool ценности. Затем,

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

varNames[varName] = true;
}
3

Другие решения

Если список этих переменных не изменится, я могу предложить вам использовать перечисление и переопределить оператор индекса:

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

Ваше второе решение — путь сюда, однако я думаю, что Корпус переключателя не уменьшает 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 ссылка.

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удобно, не так ли?

0
По вопросам рекламы [email protected]