,因此我试图拥有一个是向量的类变量,并将其传递到某些类函数之间。我想做的事情的基本版本是在以下内容中捕获的:
#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;
}
所以我有一个具有一些功能的类,但是我的主要目标是制作一个类变量向量,然后将其传递给不同的类函数。在此代码中,我将矢量称为晶格,并在set_values中设置其值,然后通过引用将晶格传递给ising_iterator,并希望更改晶格中的某些值。根据文档和其他问题,我认为我必须通过参考(因此在函数声明中)通过向量。但是我似乎仍然会遇到细分错误。我使用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;
}
一切都编译并运行良好。因此,我得出的结论是,传递的类变量是对班级函数的向量和更改它们的媒介,而不是将类变量传递给类函数并在此处更改它们。
vector<vector<int> > lattice(length, vector<int>(length));
您认为这在做什么?它实际上是要声明具有与成员变量相同名称的功能本地vector
。此阴影/生皮 是您实际上更改了本地范围的变量,而不是持续的成员 - 因为"获胜"的重复名称是最近的范围。
因此,您正在方法set_values()
中更改名为lattice
的本地变量。从定义上讲,此类更改无法在此功能之外达到任何内容。然后,局部变量不在任何地方复制或以其他方式"发送"的范围,因此您对其的所有更改都是无关紧要的。
您以后尝试访问方法ising_Iterator()
中名为 lattice
的成员变量,假设您已更改了 it it 的具有非零尺寸,则失败,因为您没有't。关于索引,繁荣:segfault。
无论如何,为什么您认为您必须在实例函数之间传递任何成员变量?所有方法都可以完全访问类成员。那就是...使用班级的重点。在成员功能之间传递成员变量 - 虽然您的关闭猜测是错误的,并且如果正确完成,则可以正常工作 - 充其量是毫无意义的,最坏的资源浪费了。
删除阴影本地,停止向成员引用,只需直接在方法中使用成员变量即可。它将起作用。