【问题标题】:How to initialize a member-array of class type variables?如何初始化类类型变量的成员数组?
【发布时间】:2016-01-26 14:08:02
【问题描述】:

我想创建一个包含 10 个Foo 的成员数组,每个都初始化为Foo(8, "10"),如下所示:

Foo bar = new Foo(8, "10")[10]; //like this

我怎样才能做到这一点?

【问题讨论】:

  • 所以你想要一个包含 10 个Foo 的成员数组,每个都初始化为Foo(8, "10")
  • @BaummitAugen 没错。这就是我想要的。

标签: c++ class parameters constructor


【解决方案1】:

假设您要初始化 10 个 Foo 类型的对象,您应该在 C++ 中使用 vector

std::vector<Foo> foos( 10, Foo(8, "10"));

【讨论】:

    【解决方案2】:

    最简单的方法是像这样使用std::vector

    struct A {
       std::vector<Foo> bar;
       A() : bar(10, Foo(8, "10")) {}
    };
    

    std::vector 可以像普通数组一样使用,加上一些简洁的额外功能记录在here

    如果vector 的动态分配证明太慢并且数字10 是编译时间常数,则可以使用std::array 代替。但是,语法并不那么漂亮,差异很可能可以忽略不计。

    【讨论】:

      【解决方案3】:

      如果数组的大小恒定且很小,可以使用:

      foo array_of_foos[3] = 
      {
          foo(8, "10"),
          foo(8, "10"),
          foo(8, "10")
      };
      

      唯一的另一种方法是使用 for() 循环,但要使其工作,foo 还必须有一个无参数构造函数(又名foo()

      xtofl 使用向量的答案也可以,假设您可以使用向量而不是数组。

      【讨论】:

        【解决方案4】:

        如果数组的大小很小,那么您可以为数组的每个元素显式指定一个初始值设定项。

        例如

        #include <iostream>
        
        struct A
        {
            A( int x, int y ) : x( x ), y( y ) {}
            int x, y;
        };    
        
        int main()
        {
            const size_t N = 10;
            A *a = new A[N] 
            { 
                { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, 
                { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 }
            };
        
            for ( size_t i = 0; i < N; i++ ) std::cout << a[i].x << ' ' << a[i].y << std::endl;
        
            delete [] a;
        
        }    
        

        程序输出是

        0 0
        1 1
        2 2
        3 3
        4 4
        5 5
        6 6
        7 7
        8 8
        9 9
        

        但如果您要动态分配数组,那么更好的方法是使用标头&lt;vector&gt; 中声明的标准类std::vector

        您可以使用与示例相同的初始化列表

            std::vector<A> v = 
            { 
                { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, 
                { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 }
            };
        

        或者您可以首先使用默认值初始化所有元素

        std::vector<A> v( N, { 0, 0 } );
        

        然后使用例如std::fillstd::generate 等标准算法重新分配它们。

        【讨论】:

          猜你喜欢
          • 2019-10-14
          • 2019-09-02
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多