在一行中初始化许多私有变量

时间:2015-10-07 17:56:24

标签: c++ constructor default-constructor

我正在研究遗留代码,如下所示:

class Foo {
  public:
    Foo();
  private:
    bool a1, a2, a3 /*, ...*/, a50;
};

Foo::Foo() {
  a1 = a2 = a3 /* = ... */ = a50 = false;
}

这很乱。有没有办法将同一时间的所有私有变量默认为与上述不同的单个值?我不想使用初始化列表,因为变量太多了。

我知道bool的默认构造函数指定为false - 可以利用它吗?

6 个答案:

答案 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;
}