C++11 C++;将类变量传递给类函数的分段错误

C++11 C++;将类变量传递给类函数的分段错误,c++11,vector,segmentation-fault,C++11,Vector,Segmentation Fault,所以我试图得到一个类变量,它是一个向量,并在一些类函数之间传递它。下面是我尝试做的一个基本版本: #include <iostream> #include <string> #include<stdlib.h> #include <vector> using namespace std; class isingModel { private: int length; public: void s

所以我试图得到一个类变量,它是一个向量,并在一些类函数之间传递它。下面是我尝试做的一个基本版本:

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
类划分模型{
私人:
整数长度;
公众:
void set_值(int);
void-ising_迭代器(向量&);
向量格;
};
void isingModel::设置_值(int l){
长度=l;
向量格(长度,向量(长度));
对于(int i=0;i
向量格(长度,向量(长度));
您认为这是在做什么?它实际做的是声明一个与成员变量同名的函数local
vector
。这会隐藏/隐藏成员,意味着您实际上是在更改一个局部作用域变量,而不是持久成员,因为“wins”的重复名称是最近作用域中的名称

因此,您正在方法
set_values()
中更改名为
lattice
的局部变量。根据定义,这样的更改无法通过此函数实现任何功能。然后,局部变量超出范围,没有被复制或以其他方式“发送”到任何地方,因此您对它所做的所有更改都是无关紧要的

您稍后尝试在方法
ising_Iterator()
中访问名为
lattice
的成员变量时,假设您已将其更改为非零大小,则会失败,因为您没有。在索引时,boom:segfault

不管怎样,为什么你认为你必须在实例函数之间传递任何成员变量?所有方法都可以完全访问类成员。这就是…使用类的全部意义。在成员函数之间传递成员变量-虽然你的结束推测是错误的,如果做得好的话,它可以正常工作-在b是没有意义的最坏的情况是浪费资源

移除阴影局部,停止传递对成员的引用,只需在方法中直接使用成员变量即可。这会起作用。

vector lattice(length,vector(length));
您认为这是在做什么?它实际做的是声明一个与成员变量同名的函数local
vector
。这会隐藏/隐藏成员,意味着您实际上是在更改一个局部作用域变量,而不是持久成员,因为“wins”的重复名称是最近作用域中的名称

因此,您正在方法
set_values()
中更改名为
lattice
的局部变量。根据定义,这样的更改无法通过此函数实现任何功能。然后,局部变量超出范围,没有被复制或以其他方式“发送”到任何地方,因此您对它所做的所有更改都是无关紧要的

您稍后尝试在方法
ising_Iterator()
中访问名为
lattice
的成员变量时,假设您已将其更改为非零大小,则会失败,因为您没有。在索引时,boom:segfault

不管怎样,为什么你认为你必须在实例函数之间传递任何成员变量?所有方法都可以完全访问类成员。这就是…使用类的全部意义。在成员函数之间传递成员变量-虽然你的结束推测是错误的,如果做得好的话,它可以正常工作-在b是没有意义的最坏的情况是浪费资源

移除隐藏的局部变量,停止传递对成员的引用,直接在方法中使用成员变量。这样就可以了

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

    lattice[0][0]=1;

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

    length=1;

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