在构造函数中初始化向量 - C++
我正在努力与我的一个类的构造函数做一个成员 未正确初始化。在构造函数中初始化向量 - C++
我有一个“设置”类来处理我用于模拟 的设置以及执行模拟步骤的类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的工作很好,我只是好奇地想知道为什么 定义它正确的方式不能按预期工作!
非常感谢您的帮助!
你不需要额外的载体:
Simulation::Simulation(Settings *pS)
:SP(pS), v(SP->n,0) {}
如果这不起作用,这是不是你的代码。您确定SP
在类定义中的v
之前被声明?如果这也不起作用,请尝试使用pS
而不是SP
。
你说得对,SP在v之前没有声明!我认为重要的命令是构造函数中的命令! 感谢您的建议,它现在工作正常:) – lucacerone 2012-08-06 03:04:14
@LucaCerone成员初始化的顺序,他们出现在类定义,这就是为什么没有采取正确的大小;) – 2012-08-06 03:05:02
是的,我意识到,以后..在我写的这个问题上没问题,但现在我已经改变了它,以便人们能够意识到我的错误在哪里! – lucacerone 2012-08-06 03:08:58
在实例化Simulation
之前,您已验证pS->n != 0
,对不对?
无论如何,我认为你在你的构造寻找线:
:SP(pS), v(pS->n, 0) {}
你现在正在做的方式是创建一个整体std::vector
然后复制它v
。
另外请确保你检查SP不是空指针。否则这将会崩溃。
Simulation::Simulation(Settings *pS)
:SP(pS), v(pS != NULL ? pS->n : 0 , 0) {}
这将检查SP不是NULL。当Simulation(NULL)用作构造函数时就是这种情况。
您不需要创建额外的矢量并使用复制构造函数。只需将参数直接传递给成员初始值设定项中的向量即可。正如另一张海报提到的,你是否证实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))
{
}
请说明问题的简短,完整,可编译的示例。 – 2012-08-06 03:02:38