2016-06-30 3 views
0

私はベクトルであるクラス変数を持っていて、いくつかのクラス関数の間に渡そうとしています。私は何をしようとしているの基本的なバージョンは、キャプチャされ、次のC++セグメンテーションフォールトクラス変数をクラス関数に渡す

#include <iostream> 
#include <string> 
#include<stdlib.h> 
#include <vector> 
using namespace std; 


class isingModel { 
    private: 
     int length; 

    public: 
     void set_values (int); 
     void ising_Iterator(vector<vector<int> > &); 
     vector<vector<int> > lattice; 
}; 


void isingModel::set_values (int l) { 
    length = l; 
    vector<vector<int> > lattice(length, vector<int>(length)); 

    for (int i=0;i<length;i++){ 
     for (int j=0;j<length;j++){ 
       int randNum = rand() % 2; // Generate a random number either 0 or 1 
       lattice[i][j]=2*(randNum-.5); //shift value so that it is either 1 or -1. 
     } 
    } 
} 

void isingModel::ising_Iterator (vector<vector<int> > & lattice) { 

    lattice[0][0]=1; 

} 



int main() { 
    int L; 
    cout << "Enter the length of the lattice: "; 
    cin >> L; 

    isingModel iModel; 

    iModel.set_values(L); 
    iModel.ising_Iterator(iModel.lattice); 
    return 0; 
} 

だから私はいくつかの機能を持つクラスを持っていますが、私の主な目標は、クラス変数ベクトルを作成し、その後にそれを渡すことです異なるクラス機能。このコードでは、vectorをlatticeと呼んでset_valuesに値を設定してから、参照によってising_Iteratorに格子を渡した後、格子の値を変更したいと思います。文書やその他の質問によると、私は参照によってベクトルを渡さなければならないと考えていました(したがって、関数宣言の&)。しかし、私はまだセグメンテーション違反を取得しているようです。 gdbを使って問題がising_Iteratorにあることを発見したので、クラス関数ising_Iteratorが格子ベクトルにアクセスできないようにする必要があります。私は混乱している理由の一つは、私が

void isingModel::ising_Iterator (vector<vector<int> > & lattice) { 

    length=1; 

} 

void isingModel::ising_Iterator (vector<vector<int> > & lattice) { 

    lattice[0][0]=1; 

} 

を交換する場合、すべてがコンパイルされ、正常に動作ということです。だから私は、あなたが、これが何をやっていたのだと思いました

答えて

2
vector<vector<int> > lattice(length, vector<int>(length)); 

...そしてちょうどクラス関数にクラス変数を渡し、そこにそれらを変更するクラス関数へのベクトルでクラス変数を渡して、それらを変更することは根本的に異なっていると結論づけましたか?実際には、メンバー変数と同じ名前の関数ローカルのvectorを宣言します。このは、のメンバーを隠す/隠すので、永続メンバではなく、ローカルスコープの変数を実際に変更していることを意味します。これは、「wins」という名前が最も近いスコープにあるためです。

したがって、方法​​のlatticeという名前のローカル変数を変更しています。このような変更は、定義上、この機能以外のものには到達できません。ローカル変数はコピーされたり、どこにでも送られたりすることなく、範囲外になります。そのため、あなたの変更はすべて重要ではありません。あなたがいなかったので、それが非ゼロの大きさを持っているあなたがを変更していたと仮定し

方法ising_Iterator()latticeという名前メンバー変数にアクセスするには、以降の試みは、失敗します。インデックス作成では、ブーム:segfault。

とにかく、インスタンス変数間でメンバー変数を渡す必要があると思います。すべてのメソッドはクラスメンバーにフルアクセスできます。それは...クラスを使用する全体のポイントのようなものです。メンバ関数間でメンバ変数を渡す - 閉じた投機が間違っていて正しく実行されるとうまくいく - 無意味で、最悪の場合はリソースの無駄です。

シャドウイングローカルを削除し、メンバーへの参照を回避し、メソッド内で直接メンバー変数を使用します。それは動作します。