2012-08-06 48 views
0

我正在努力與我的一個類的構造函數做一個成員 未正確初始化。在構造函數中初始化向量 - 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

回答

2

你不需要額外的載體:

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

2

在實例化Simulation之前,您已驗證pS->n != 0,對不對?

無論如何,我認爲你在你的構造尋找線:

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

你現在正在做的方式是創建一個整體std::vector然後複製v

0

另外請確保你檢查SP不是空指針。否則這將會崩潰。

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

這將檢查SP不是NULL。當Simulation(NULL)用作構造函數時就是這種情況。

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)) 
{ 

}