【问题标题】:newbie: C++ question about initialization lists新手:关于初始化列表的 C++ 问题
【发布时间】:2009-08-21 18:33:14
【问题描述】:

假设我在标题中声明了一个对象数组。数组的大小可能非常大。在我的源文件中,我为我的类创建了构造函数,并且我想初始化我的数组中的所有对象。如果这些对象不是用零参数构造函数构造的,我被告知这些需要放在我的初始化列表中。

我的问题是,如果我想使用循环来初始化这个可能很大的对象数组,那不会进入初始化列表,对吗?我不想放入我的初始化列表:str1("1"), str2("2"), ... , strn("n")。初始化所有这些对象的循环是否可以放在头文件中,或者可能放在构造函数的主体中?

请告诉我。我没见过这样的例子。

谢谢, jbu

【问题讨论】:

  • 您能否在您的问题中添加一些示例代码以提高其清晰度?

标签: c++ arrays object initialization


【解决方案1】:

你不能在初始化列表中循环,但是在构造函数体中循环没有问题,只要对象类型有一个有效的赋值运算符。数组中的对象将首先使用它们的零参数构造函数初始化,在构造函数主体之前。然后在正文中,您将重新分配它们到它们需要的任何位置。

还要注意,如果要使用相同的非零参数构造函数初始化数组中的每个对象,则可以使用 std::vector 类型,并在初始化器列表中指定默认的非零构造函数为分配内部数组时使用,即:

// in .h

class MyClass
{
...
    MyClass();

private:

    vector<SomeObject> objects;
};

// in .cpp

MyClass::MyClass()
: objects(100,SomeObject(10, "somestring"))
{
}

【讨论】:

    【解决方案2】:

    您必须等待 C++0x 在初始化器列表中初始化一个数组。

    struct S { 
        int a[3]; 
        S(int x, int y, int z) :a{x,y,z} { /*…*/ }; // solution to old problem 
    };
    

    【讨论】:

      【解决方案3】:

      使用 boost assign 来声明元素的 const 向量是可能的:

      #include<vector>
      #include<iostream>
      #include<boost/foreach.hpp>
      #include<boost/assign.hpp>
      #include<boost/assign/list_of.hpp>
      #include<boost/assign/std/vector.hpp>
      
      using namespace std;
      using namespace boost;
      using namespace boost::assign;
      
      typedef vector<int> int_vector;
      
      const int_vector my_const_vector = list_of
      (1)(2)(3)(5)(8)(13)(21)(34)(55)(89);
      
      class myClass
      {
          public :
            // initialization list used in the constructor
            myClass(const int_vector & vec) 
              : m_member_vector(int_vector(vec.begin(), vec.end())) 
            {}
            void print() const 
            { 
                 BOOST_FOREACH(int i, m_member_vector) 
                 { cout << i << endl; } 
            }
          private :
            int_vector m_member_vector;
      };
      
      void main()
      {
         myClass m(my_const_vector);
         m.print();
      }
      

      您可以从here 获得提升。我意识到这不是数组,但这确实解决了你的问题 - 在某种程度上

      【讨论】:

        【解决方案4】:

        您不能在初始化列表中初始化数组。您必须在构造函数的主体中执行此操作。

        如果您想要的数组不是默认可构造的,最简单的解决方案是使用 std::vector 而不是原始数组。这样,您可以在将元素添加到构造函数主体时构造它们。

        但是,如果您坚持将其类型没有默认构造函数的对象的原始数组作为类成员,那么您唯一真正的选择是使其成为指向 Foo 的指针数组而不是 Foo 数组.

        【讨论】:

          【解决方案5】:

          不是“新手”答案,我也不会使用,但您可以查看 boost preprocessor 库,它允许您使用预处理器创建循环。

          【讨论】:

            【解决方案6】:

            从您的问题来看,您似乎想用不同的参数初始化数组的每个元素(如列表 str1("1"), str2("2"), strn("n") 所暗示的) )。这在当前的 C++ 中是不可能的;正如 TimW 所说,C++0X 将允许通过序列构造函数支持这种类型的初始化。

            话虽如此,看来您要做的是这些值(“1”),(“2”)...(“n”)的运行时初始化(您在编译时知道这些值吗? ?)。如果是这种情况,我认为即使在 C++0X 中也不能使用初始化列表。如果不是这种情况(为这个非常大的数组传递编译时参数),那么预处理器的魔法就是要走的路。

            【讨论】:

              猜你喜欢
              • 2010-12-22
              • 1970-01-01
              • 1970-01-01
              • 2020-12-16
              • 2022-11-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-10
              • 1970-01-01
              相关资源
              最近更新 更多