C ++类成员初始化两次

时间:2012-12-05 17:21:24

标签: c++

是否有两个MyVec被创建?在MyVec的构造函数中,是否存在一个临时构造的Foo

struct Foo {

  typedef std::vector<int> MyVec;

  Foo () {

    // determine how big the vector needs to be.
    // .....

    m_vec = MyVec(12);
  }

  MyVec m_vec; 
};

我知道我可以使用指针来做到这一点。

struct Foo {

  typedef std::vector<int> MyVec;

  Foo () {
    m_vec = new MyVec();
  }

  ~Foo () {
    delete m_vec;
  }

  MyVec * m_vec;
};

但如果可能,我想避免这种情况。

修改

我忘了提。我不能使用初始化列表,因为我需要在赋值之前在构造函数中做一些事情。

3 个答案:

答案 0 :(得分:6)

请尝试使用以下语法:

struct Foo {

  typedef std::vector<int> MyVec;

  Foo ()
  : m_vec(12)
  {
  }

  MyVec m_vec; 
};

它被称为c++ member initialization list


  

我不能使用初始化列表,因为我需要在赋值之前在构造函数中做一些事情。

如果你需要计算向量的大小,也许你可以在调用构造函数之前或在从构造函数调用的静态方法中执行此操作:

struct Foo {

  typedef std::vector<int> MyVec;

  Foo ()
  : m_vec(calculateVectorSize())
  {
  }

  static int calculateVectorSize()
  {
      // determine how big the vector needs to be.
      // .....
  }

  MyVec m_vec; 
};

如果这些也不可能,那么比原始帖子更便宜的解决方案是:

struct Foo {

  typedef std::vector<int> MyVec;

  Foo () {

    // determine how big the vector needs to be.
    // .....

    m_vec.resize(12);
  }

  MyVec m_vec; 
};

答案 1 :(得分:1)

是的,你可以避免它:

Foo():
  m_vec(/*args_to_construct_m_vec*/)
{
  // body goes here
}

通过上面的语法。

如果您不能使用初始化程序列表,因为您希望将工作内容放入m_vec,则另一种方法是拆分您的类。

在计算m_vec的大小之前需要初始化的类的部分会陷入父类。您构造它,然后在初始化列表中构造m_vec

请注意,std::vector默认初始化非常便宜(通常是memsetsizeof(3个指针)到0),因此您的担忧几乎肯定是错位的。

答案 2 :(得分:1)

我相信typedef只是告诉编译器MyVec可以被视为包含矢量库的vector<int> gvien。

但是,尚未构建实际的MyVec

此外,您应该尝试使用替代和更首选的语法来初始化成员字段。