如何通过函数在 C++ 中设置私有静态数组?

Posted

技术标签:

【中文标题】如何通过函数在 C++ 中设置私有静态数组?【英文标题】:How do I set a private static array in C++ via a function? 【发布时间】: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 元素,如果失败,它将返回10 心理长期猜测:您没有为全局数组和静态类成员使用相同的名称。当您添加类成员时,您保留了旧变量,并且您仍然在 set_array 中引用它。 【参考方案1】:

在数组上使用运算符 sizeof() 并不总是按照您预期的方式运行。根据上下文,可以将数组解释为只是一个指针,如here 所述。

我认为你真正想做的是将fread更改为:

size_t numread = fread(somearray, sizeof(int), 1000, fin);

【讨论】:

您所说的“数组上的 sizeof() 并不总是按您预期的方式运行” 我理解你的意思,但我想更多的是你编辑你的答案,这样人们就可以在不查看 cmets 的情况下理解你的意思。 啊,对不起。我在这里有点新,不明白推论。我添加了链接。 刚刚试了一下,不是这样,很遗憾。即使尝试手动设置所有值,它仍然给出相同的结果。就好像该函数甚至从未被调用过。 @Mark:然后就像函数从未调用过。您没有发布足够的代码来说明发生了什么。你认为你做了什么来调用那个初始化函数?【参考方案2】:

我认为 fread 从流中读取为一个字符(我的猜测),所以尝试将 somearray 更改为 static char somearray[1000] ,我认为它会起作用

注意: fread 甚至将“\0”读取为单个字符

【讨论】:

以上是关于如何通过函数在 C++ 中设置私有静态数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据

如何在 Visual Studio (C++) 中设置发布分析

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

如何测试在视图控制器单元测试中设置私有变量的方法?

如何在数组中设置特定对象的状态

如何在 C# 模型类中设置数组属性的值