我正在研究遗留代码,如下所示:
class Foo {
public:
Foo();
private:
bool a1, a2, a3 /*, ...*/, a50;
};
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
这很乱。有没有办法将同一时间的所有私有变量默认为与上述不同的单个值?我不想使用初始化列表,因为变量太多了。
我知道bool
的默认构造函数指定为false - 可以利用它吗?
答案 0 :(得分:2)
有很多可行的方法,但它们都非常相似。无论如何,你将使用不同的形式为每个变量分配。
我认为最好的主要方法是在构造函数中逐行分配所有变量。可能是它不紧凑,但它最有意义,你总是很容易看到你的变量默认值:
SELECT customer_entity.entity_id as "Customer ID"
customer_address_street.value as "Street"
LEFT JOIN customer_address_entity_varchar as customer_address_street
ON customer_address_street.entity_id = customer_entity.entity_id
WHERE customer_address_street.attribute_id = 19;
您使用assign运算符描述了另一种方法:
Foo::Foo() {
a1 = false;
a2 = false;
/*...*/
a50 = false;
}
另一个允许在构造函数声明后立即初始化变量:
Foo::Foo() {
a1 = a2 = a3 /* = ... */ = a50 = false;
}
如果我忘了任何方法,请将其写入评论。
答案 1 :(得分:1)
class Foo
{
private:
bool a1{}, a2{}, /*...,*/ a50{};
};
答案 2 :(得分:0)
试试这个
Foo::Foo (bool aa) : a1 (aa) , a2 (aa), a3 (aa),/*......*/a50(aa){}
答案 3 :(得分:0)
您可以使用另一个类(在单独的标题中),如下所示。
class myBool {
public:
myBool(int x = 1) { _m = x; }
operator bool() const { return 0 < _m; }
private:
int _m;
};
并在您的文件中添加以下内容
#include "myBool.h"
#define bool myBool
这会将所有bool初始化为您在myBool中设置的默认值。您可能需要向myBool类添加更多方法,以将其用作完整的fledge数据类型。以上是解释答案的最低要求。
答案 4 :(得分:0)
以下是迄今为止我发布过的解决方案的另一种解决方案,以防它对您有用。
将要批量初始化的数据放入其自己的struct中的默认false / 0值:
struct MyData
{
bool a, b, c, d;
std::string e, f;
};
现在从这个结构继承(私有或其他),并在构造函数的初始化列表中显式初始化它:
class MyClass : private MyData
{
public:
MyClass()
: MyData()
{
}
};
这会将所有bools设置为false,字符串为空,任何int变为0,指针变为null等等
如果您忘记将结构显式放在初始化列表中,则其某些成员可能未初始化。
答案 5 :(得分:0)
确认在c ++中总是需要做更多的工作......
#include <iostream>
#include <utility>
template<class Tuple, std::size_t...Is>
void zero_out_impl(Tuple& t, std::index_sequence<Is...>)
{
using expand = bool[];
(void) expand { false, (std::get<Is>(t) = false)... };
}
template<class...Args>
void zero_out(std::tuple<Args...> t)
{
zero_out_impl(t, std::index_sequence_for<Args...>());
}
struct lots_of_bools {
lots_of_bools()
{
zero_out(std::tie(a,b,c,d,e,f,g,h,i,j));
}
private:
bool a,b,c,d,e,f,g,h,i,j;
};
auto main() -> int
{
lots_of_bools x;
return 0;
}