我正在尝试用C ++实现一个用于存储优化问题数据的类。数据保存在文本文件中,格式为
因此,在我阅读文件之前,我不知道问题的大小,因此我需要动态分配内存。到目前为止我所做的是公开声明一个指针
int** C;
头文件中的。然后在.cpp文件的构造函数中我做
ifstream InFile( fname );
InFile >> n;
InFile >> m;
int** C = (int**) calloc(n, sizeof(int *));
for(int i=0; i<n; ++i){
C[i] == (int*) calloc(m,sizeof(int));
for(int j=0, j<m; ++j){
InFile >> C[i][j];
}
}
其中fname
是作为构造函数的参数给出的数据文件。当我在一个成员函数中,调用它ProcessData()
尝试访问指向整数数组的指针的指针时,会出现问题。它似乎改变了地址!当我做的时候
cout << C;
在构造函数中我得到了
0000000000359300
然而,当我在成员函数中做同样的事情时,我得到了
000000013F57710C100
有谁能告诉我这里做错了什么? 我在64位Windows 7计算机上使用Visual Studio中的Visual C ++。
答案 0 :(得分:2)
这一行
int** C = (int**) calloc(n, sizeof(int *));
声明一个新的(本地)变量并初始化它。要设置成员变量的值,只需删除声明位:
C = (int**) calloc(n, sizeof(int *));
答案 1 :(得分:0)
首先,不要在C ++中管理自己的内存。你可以简单地使用std::vector<std::vector<int>>
为你管理它,这实际上有可能是正确的。
其次,在构造函数中,C是局部变量,因此它不可能与同时存在的任何其他变量具有相同的地址。
答案 2 :(得分:0)
最简单的方法是让你的班级有一个成员向量。向量包含一个指针并为其动态分配内存的过程,当您复制,移动或销毁对象时,它们的行为正常:
class MyClass
{
public:
std::vector< std::vector<int> > C;
MyClass(size_t rows, size_t cols):
C( rows, std::vector<int>(cols, 0) )
{ }
};
在构造函数中进行用户输入可能是一个坏主意;而是做输入(并检查成功),然后构造对象:
size_t rows, cols;
if ( !(inFile >> rows >> cols) )
throw std::runtime_error("input error");
MyClass obj(rows, cols);