在构造函数中初始化向量 - 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的工作很好,我只是好奇地想知道为什么 定义它正确的方式不能按预期工作!

非常感谢您的帮助!

+0

请说明问题的简短,完整,可编译的示例。 – 2012-08-06 03:02:38

你不需要额外的载体:

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

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

+0

你说得对,SP在v之前没有声明!我认为重要的命令是构造函数中的命令! 感谢您的建议,它现在工作正常:) – lucacerone 2012-08-06 03:04:14

+0

@LucaCerone成员初始化的顺序,他们出现在类定义,这就是为什么没有采取正确的大小;) – 2012-08-06 03:05:02

+0

是的,我意识到,以后..在我写的这个问题上没问题,但现在我已经改变了它,以便人们能够意识到我的错误在哪里! – 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)) 
{ 

}