2017-04-04 9 views
1

私はC++を初めて使用しています。 2dベクトルポインタで構成されるクラスを作成しようとしています。私は引数として2Dベクトルをとるオブジェクトを作成しています。私はポインタを使用してこの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'は自動変数です。 a *渡された引数のコピー*コンストラクタがスコープを終了した瞬間に存在しなくなる自動変数のアドレスを保存しています。 – WhozCraig

+0

@WhozCraigどうすればいいですか? – jennifer

答えて

1

コピーする代わりに、vを渡す必要があります。

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

あなたそうでなければ、再び、セグメンテーションフォールトを得るでしょう、あなたのvector<vector<float>>あなたVectorrefをoutlivesことを確認する必要があります。

getval関数は、floatで、doubleでないはずです。

+0

ありがとうたくさん:D – jennifer

+0

私はかなり基本的な質問を知っていますが、私はこのコードで、 'p'ベクターだけがメモリーを占有していることを尋ねました。ポインティングと参照はメモリを占有するコピーを作成していませんか? – jennifer

+0

元の例です。変数 'vector > A'が最も多くのメモリを占有します。他の変数 'Vectorref B'は' sizeof(vector <ベクトル> *)== sizeof(size_t) 'バイトだけを必要とします.64ビットマシンでは8バイトです。 – Jonas

関連する問題