0

我正在努力处理我的一个类的构造函数对未正确初始化的成员所做的事情。

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

我无法理解的是为什么这段代码不能按预期工作:

      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

4 回答 4

2

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

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

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

您现在的做法是创建一个整体std::vector,然后将其复制v.

于 2012-08-06T02:57:45.263 回答
2

您不需要额外的向量:

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

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

于 2012-08-06T02:57:57.317 回答
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))
{

}
于 2012-08-06T03:10:47.687 回答
0

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

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

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

于 2012-08-06T03:07:24.547 回答