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

时间:2016-06-30 21:46:14

标签: c++11 vector segmentation-fault

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

#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;
}

所以我有一个有一些函数的类,但我的主要目标是创建一个类变量向量,然后将它传递给不同的类函数。在这段代码中,我创建了一个名为lattice的向量,并在set_values中设置了它的值,然后通过引用将格子传递给ising_Iterator,并希望更改格中的某些值。根据文档和其他问题,我认为我必须通过引用传递向量(因此&amp;在函数声明中)。但我似乎仍然得到分段错误。我使用gdb发现问题出在ising_Iterator中,因此必须是类函数ising_Iterator无法访问晶格向量。我很困惑的一个原因是,如果我更换

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

    lattice[0][0]=1;

}

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

    length=1;

}

一切都编译好了。所以我得出结论,将类变量传递给类函数并更改它们的类变量与将类变量传递给类函数并在那里更改它们从根本上是不同的。

1 个答案:

答案 0 :(得分:2)

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

您认为这是做什么的?它实际上做的是声明一个与成员变量同名的函数本地vector。这个阴影/隐藏成员,意味着你实际上改变了一个本地范围的变量,而不是持久成员 - 因为重复的名称“赢得了”。是最近范围内的那个。

因此,您正在更改方法lattice中名为set_values()的本地变量。根据定义,这些变化无法通过此功能达到任何目的。然后,本地变量超出范围,未经复制或以其他方式发送&#39;在任何地方,所以你对它的所有改变都是无关紧要的。

您稍后尝试访问方法lattice中名为ising_Iterator()成员变量,假设您已将 更改为非零大小,失败,因为你没有。关于索引,繁荣:segfault。

无论如何,为什么你认为你必须在实例函数中传递任何成员变量?所有方法都可以完全访问类成员。这就是......使用课程的全部意义。在成员函数之间传递成员变量 - 虽然你的结束推测是错误的,如果正确完成它会正常工作 - 充其量是没有意义的,最坏的情况是浪费资源。

删除阴影局部,停止传递对成员的引用,并直接在方法中使用成员变量。它会起作用。