2017-04-04 69 views
1

我是新來的C++。 我想做一個由2D矢量指針組成的類。我正在創建一個將2D矢量作爲參數的對象。我正在嘗試使用pointer來引用這個2D矢量。這種編譯方式很好,但在執行時出現了分段錯誤。 我在這裏附上我的代碼。請幫忙!2D矢量指針作爲類的成員

# include <iostream> 
# include <vector> 
using namespace std; 

class Vectorref { 
     vector<vector<float> > *vptr; // pointer to 2D vector 

    public: 
     Vectorref(vector<vector<float> >); 
     double getval(int,int); 
}; 

Vectorref::Vectorref(vector<vector<float> > v) 
{ 
    vptr = &v; 
} 

double Vectorref::getval(int r, int c) 
{ 
    return (*vptr)[r][c]; 
} 

int main(){ 
    vector<vector<float> > A (3,vector<float>(3,2.0)); 

    Vectorref B(A); 

    for(int i=0; i<3 ;i++){ 
     for(int j=0; j<3; j++){ 
      cout << B.getval(i,j) << "\t"; 
     } 
     cout << endl; 
    } 

    return 0; 
} 
+3

'vptr =&v;' - 'v'是一個自動變量;傳入參數的*副本*。您正在保存一個自動變量的地址,該構造函數在構造函數退出時將不再存在。 – WhozCraig

+0

@WhozCraig我應該怎麼做呢? – jennifer

回答

1

您應該通過v作爲參考而不是複製。

Vectorref(vector<vector<float> >&); 
Vectorref::Vectorref(vector<vector<float> >& v) 

MUST確保您vector<vector<float>>會超越你的Vectorref,否則你會得到分段錯誤,再次。

您的getval函數應返回float而不是double

+0

非常感謝:D – jennifer

+0

我知道它很基本的問題,但我想問一下,在這段代碼中,只有'p'向量佔用內存,對吧?指向和引用不會創建任何將佔用內存的副本? – jennifer

+0

從你原來的例子。變量'矢量<矢量> A'將佔據最多的內存。另一個變量'Vectorref B'只需要sizeof(vector > *)== sizeof(size_t)'字節,在64位機器上是8字節。 – Jonas