【发布时间】:2013-02-14 12:51:21
【问题描述】:
我有一个类,它作为成员包含一个大数组。
exampleclass{
public:
...
static void set_array();
static int somearray[1000];
};
(该数组应该是私有的,但为了快速和肮脏的测试目的,我将它设置为公共。见下文)
现在,数组初始化为:
int exampleclass::somearray[1000];
这意味着我所有的值都是 0。到目前为止,一切都很好
现在,我想用一个函数来初始化它,它的定义如下:
void exampleclass::set_array()
{
memset(somearray, 0, sizeof(somearray));
FILE* fin= fopen("myfile.dat", "rb");
size_t bytesread= fread(somearray, sizeof(somearray), 1, fin);
fclose(fin);
}
所有这些都包含在头文件中
如果我在任何类之外使用它(即:somearray[1000] 是一个全局变量,并且我将上述函数作为主函数中的全局函数调用,那么一切都像一个魅力。
但是当我现在从主函数中执行以下操作时:
int main()
{
exampleclass::set_array();
for (int i=0; i<20; i++)
{
std::cout << exampleclass::somearray[i] << std::endl;
}
return 0;
}
我得到的输出是:
0
0
0
...
0
即使我希望它输出从 myfile.dat 读取的值。
我做错了什么?如何告诉类用我提供的函数修改静态成员?
【问题讨论】:
-
你试过调试它吗?有很多事情可能会发生......
-
1) “所有这些都包含在头文件中”
int exampleclass::somearray[1000];的定义不应该在头文件中。 2) 你检查了吗,FILE* fin= fopen("myfile.dat", "rb");fin之后不是 NULL ? 3) 文件“myfile.dat”是否包含非零值? -
@Mark 你在
fclose之前检查过bytesread的值吗? -
顺便说一句,fread 返回“返回成功读取的元素总数”,但不返回字节数。好像你问
1元素,如果失败,它将返回1或0 -
心理长期猜测:您没有为全局数组和静态类成员使用相同的名称。当您添加类成员时,您保留了旧变量,并且您仍然在
set_array中引用它。