构造函数中向量的初始化 - C ++

时间:2012-08-06 02:52:40

标签: c++ vector constructor

我正在努力与我的一个类的构造函数对一个成员做 没有正确初始化。

我有一个“设置”类来处理我用于模拟的设置 以及执行模拟步骤的类Simulations。

我无法理解的是为什么此代码无法正常工作:

      class Settings{ 
         public: 
           int n ; // a number I need to create properly a vector in my class simulation
           // ... rest of the code constructors etc to read values from files.
           // everything works fine and the values are assigned properly
       }

       class Simulation{
          public:
          std::vector<int> v ;
          Settings *SP;

          Simulation(Settings *);
        }

        Simulation::Simulation(Settings *pS) 
           :SP(pS), v(std::vector<int>(SP->n,0)) {}    // the constructor doesn't work,
    // v is initialized but it is not created as a vector of size n, but 0.

我认为我使用构造函数的方式存在问题,但我无法理解原因。

顺便说一下,在花括号中定义v的方式很好,我只是好奇知道为什么 以正确的方式定义它并不像预期的那样工作!

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您在实例化pS->n != 0之前已经验证了Simulation,对吧?

无论如何,我认为你在构造函数中寻找的行是:

:SP(pS), v(pS->n, 0) {}

您现在的做法是创建整个std::vector,然后复制到v

答案 1 :(得分:2)

您不需要额外的矢量:

Simulation::Simulation(Settings *pS) 
       :SP(pS), v(SP->n,0) {}

如果这不起作用,这不是您的代码。您确定在类定义中SP之前声明了v吗?如果这也不起作用,请尝试使用pS代替SP

答案 2 :(得分:0)

另外请确保检查SP不是空指针。否则会发生崩溃。

Simulation::Simulation(Settings *pS) 
   :SP(pS), v(pS != NULL ? pS->n : 0 , 0) {}

这将检查SP不是NULL。当Simulation(NULL)用作构造函数时就是这种情况。

答案 3 :(得分:0)

您无需创建额外的向量并使用复制构造函数。只需将参数直接传递给成员初始值设定项中的向量即可。正如另一张海报所提到的那样,您是否确认SP-> n的返回实际上不是0?如果您对某些值进行硬编码,您会发现它工作正常,如下所示:

#include <iostream>
#include <vector>
using namespace std;

class foo
{
public:
    foo();
    vector<int> vec;
};

int main()
{
    foo obj;
    for(int i=0;i<obj.vec.size();++i) {
        cout << obj.vec[i] << ' ';
    }
    system("pause");
    return 0;
}


foo::foo()
    :vec(vector<int>(10,2))
{

}