4

是否MyVec正在创建两个?MyVec在 的构造函数中的assinment 之前是否存在临时的、默认构造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;
};

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

编辑:

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

4

3 回答 3

6

请尝试以下语法:

struct Foo {

  typedef std::vector<int> MyVec;

  Foo ()
  : m_vec(12)
  {
  }

  MyVec m_vec; 
};

它被称为c++ 成员初始化列表


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

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

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; 
};
于 2012-12-05T17:23:45.183 回答
1

是的。

是的,你可以避免它:

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

通过上面的语法。

如果你不能使用初始化器列表,因为你想把什么放进去m_vec,另一种方法是拆分你的类。

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

请注意,std::vector默认初始化非常便宜(通常是“ memsetsizeof(3 个指针)指向0),所以您的担心几乎肯定是放错了地方。

于 2012-12-05T17:24:17.750 回答
1

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

但是,还没有实际MyVec构建。

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

于 2012-12-05T17:27:45.020 回答