我正在努力与我的一个类的构造函数对一个成员做 没有正确初始化。
我有一个“设置”类来处理我用于模拟的设置 以及执行模拟步骤的类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的方式很好,我只是好奇知道为什么 以正确的方式定义它并不像预期的那样工作!
非常感谢您的帮助!
答案 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))
{
}