【问题标题】:Compiler Crash with C++ ArrayC++ 数组导致编译器崩溃
【发布时间】:2017-09-19 16:17:58
【问题描述】:

我是 C++ 的新手(Java 中的背景),并且遇到了一个奇怪的数组问题。 我有以下涉及掷骰子的代码,该数组用于存储以前的掷骰子。

#include <stdlib.h> //c file for random number generator
#include <iostream>
#include "Dice.h";

using namespace std;

int previousTurns[10];
int count = 0;
void Dice::roll()
{
   cout<<"Rolling Dice....";
   int seed = rand() %100;
   srand(seed);
   int roll = rand() %6 + 1;
   cout<<"You have rolled a " << roll << "\n";
   previousTurns[count] = roll;
   count++;
}

我还有一个头文件 Dice.h(包括我还没有实现的其他方法):

#ifndef DICE_H_
#define DICE_H_

class Dice
{
   private:
      int previousTurns[10];
      int count;
      void extendArray(int a[]); 
      int size();
   public:
      void roll();
      void previousRolls();
      void displayArray();
};
#endif /* DICE_H_ */

除了“previousTurns[count] = roll”这一行之外,所有这些代码都可以工作,编译器一旦到达这一行就崩溃了,没有任何错误。

【问题讨论】:

  • 你用的是什么编译器?你能创建一个minimal reproducible example吗?
  • 你滚动了多少次......?
  • 您有两次previousTurnscount,一次在类中,一次作为在源文件中声明的全局变量。不应该是这里的问题,但至少它是令人困惑的
  • ...,也许是问题所在。你初始化了count,但是你初始化了Dice::count 吗?如果你不这样做,那么previousTurns[count] 是未定义的行为
  • 使用 std::vector 是一个很好的解决方案。 extendArray 看起来不祥。由于缺乏可重复的例子而投票结束。

标签: c++ arrays class


【解决方案1】:

在你的源文件中有

int previousTurns[10];
int count = 0;

它们不同于previousTurnspreviousTurnscount 成员。实际上,它们是完全不相关的变量,只是碰巧具有相同的名称。另一方面,成员count 在这里未初始化:

 previousTurns[count] = roll;

请注意,在成员函数中,它是成员 count,而不是来自 int count = 0; 的成员。您应该在构造函数中初始化它,如下所示:

Dice::Dice() : count(0) {}

还请注意,您应该只调用一次seed(例如在构造函数中),而不是每次滚动一个数字。

【讨论】:

  • 啊我明白了,所以你不需要再定义头文件中定义的变量了?例如我可以在头文件中初始化 count = 0 然后在源文件中使用 Dice::count ?也就是 Dice::count 和 count 不一样(当作不同的变量)
  • ..当然它与 Java 不同。无意冒犯,但如果你认为你可以在中等水平上进入 c++,因为你知道 java,那么你就错了。
  • 酷,有没有办法包含 cpp 文件,即制作没有头文件的类以避免这种命名约定问题(即 Dice::count vs count),或者这是 c++ 中的不好做法跨度>
  • @JmanxC 我不明白这个问题。你根本不需要源文件中的int count = 0;
  • 是的,我现在知道我不知道,我已经从文件中删除了计数,因为我在我的主驱动程序中包含了 .h,我已经在我的头文件中包含了这些变量定义。我的问题是,是否可以创建一个没有头文件的类文件(即在 .cpp 文件中定义类)并将该 .cpp 文件包含在主驱动程序中。这将允许我使用“int count”而不是“Dice::count”,或者包含 cpp 文件而不是 .h 文件是不好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
相关资源
最近更新 更多