C++ 基于SDL的河内塔游戏中的奇怪问题

C++ 基于SDL的河内塔游戏中的奇怪问题,c++,class,infinite-loop,C++,Class,Infinite Loop,我想创建一个基于SDL的河内塔游戏,但在开始编写“引擎”之前,我想在控制台中测试我的河内塔。令人惊讶的是,结果是相当多的童车 CTower tower[3]; tower[0] = CTower(3); tower[1] = CTower(3); tower[2] = CTower(3); init(&tower[0]); //prepare first tower tower[0].Print(); 这段代码应该创建3个数组(大小为3)并用0(零)填充它们。然后,在init()

我想创建一个基于SDL的河内塔游戏,但在开始编写“引擎”之前,我想在控制台中测试我的河内塔。令人惊讶的是,结果是相当多的童车

CTower tower[3];

tower[0] = CTower(3);
tower[1] = CTower(3);
tower[2] = CTower(3);

init(&tower[0]);  //prepare first tower
tower[0].Print();
这段代码应该创建3个数组(大小为3)并用0(零)填充它们。然后,在init()中,我准备第一个塔(用可用光盘填充)。无论看起来多么简单,我的应用程序都会停止打印,并且不会填充剩余的数组(0)。奇怪的是,函数init()工作得很好

我将感谢任何帮助

下面是一些要检查的代码:

class CTower {
    uint16 *floors, floorsNum;

    void Init();

  public:
    (...) //definitions, probably of zero importance
};

void CTower::Init() {
  //private member, filling with zeros
  for (uint16 i = 0; i < floorsNum; i++)
    floors[i] = 0;
}
CTower::CTower() {
  //default initialiazer
  floors = NULL;
  floorsNum = 0;
}
CTower::CTower(uint16 nfloors) {
  floors = new uint16[nfloors];
  floorsNum = nfloors;
  this->Init();
}
CTower::~CTower() {
  delete[] floors;
  floorsNum = 0;
}
void CTower::Print() {
  if (floorsNum == 0) printf("EMPTY TOWER!");
  else
    for (uint16 i = 0; i < floorsNum; i++)
      printf("%d\n", floors[i]);
}
void init(CTower *tower) {
  //a friend method of CTower
  for (uint16 i = 0; i < tower->floorsNum; i++)
    tower->floors[i] = i+1;
}
class-CTower{
uint16*楼层,楼层数;
void Init();
公众:
(…)//定义,可能不重要
};
void CTower::Init(){
//私有成员,用零填充
对于(uint16 i=0;i初始化();
}
CTower::~CTower(){
删除[]层;
floorsNum=0;
}
void CTower::Print(){
如果(floorsNum==0)printf(“空塔!”);
其他的
对于(uint16 i=0;ifloorsNum;i++)
塔楼->楼层[i]=i+1;
}
我的应用程序来源:

问题在于初始化和分配类。看来你忘了。 您正面临自由损坏:对未分配的属性调用delete[]

您有以下构造函数:

CTower::CTower() {
//default initialiazer
floors = NULL;
floorsNum = 0;
}
int main(void) {
  CTower tower[3] = { CTower(3), CTower(3), CTower(3) };

  init(&tower[0]);
  tower[0].Print();
  printf("\n");
  tower[1].Print();

  return 0;
}
它不分配内存,但会被以下内容破坏:

CTower::~CTower() {
  delete[] floors;
  floorsNum = 0;
}
修复程序的一种简单方法是直接使用工作构造函数进行分配:

CTower::CTower() {
//default initialiazer
floors = NULL;
floorsNum = 0;
}
int main(void) {
  CTower tower[3] = { CTower(3), CTower(3), CTower(3) };

  init(&tower[0]);
  tower[0].Print();
  printf("\n");
  tower[1].Print();

  return 0;
}
但在析构函数或构造函数部分也修复类会更好

问题在于您的初始化和班级分配。看来你忘了。 您正面临自由损坏:对未分配的属性调用delete[]

您有以下构造函数:

CTower::CTower() {
//default initialiazer
floors = NULL;
floorsNum = 0;
}
int main(void) {
  CTower tower[3] = { CTower(3), CTower(3), CTower(3) };

  init(&tower[0]);
  tower[0].Print();
  printf("\n");
  tower[1].Print();

  return 0;
}
它不分配内存,但会被以下内容破坏:

CTower::~CTower() {
  delete[] floors;
  floorsNum = 0;
}
修复程序的一种简单方法是直接使用工作构造函数进行分配:

CTower::CTower() {
//default initialiazer
floors = NULL;
floorsNum = 0;
}
int main(void) {
  CTower tower[3] = { CTower(3), CTower(3), CTower(3) };

  init(&tower[0]);
  tower[0].Print();
  printf("\n");
  tower[1].Print();

  return 0;
}

但在析构函数或构造函数部分也修复类会更好

我也会考虑摆脱朋友功能空缺(CTA塔*塔),因为这确实不是很好的练习。< /P>


<>我会提供一个代码示例,但是这个问题被标记为“家庭作业”,所以我会让你自己做研究。

除非你被特别要求不要使用一个STD::向量,那么我会考虑改变你的代码来使用一个,因为它使生活变得简单很多。 关于您的特定代码示例。由于缺少复制构造函数和赋值运算符,您将遇到问题,因为编译器生成的默认值不适合您的类

我也会考虑摆脱朋友功能空缺(CTA塔*塔),因为这确实不是很好的练习。< /P>


我会提供一个代码示例,但是这个问题被标记为“家庭作业”,所以我会让你自己做研究。

我认为你的
}应该在方法的末尾,也就是方法的末尾。您也可以在print方法上放置一个断点,并找出
floorNum
的值。您是否介意同时显示
init
函数?另外,您是否尝试过在调试器中单步执行代码?显示更多代码。是否为CTower类定义了析构函数或赋值运算符?问题可能在init(&tower[0]);,我想你的
}应该在方法的末尾,也就是方法的末尾。您也可以在print方法上放置一个断点,并找出
floorNum
的值。您是否介意同时显示
init
函数?另外,您是否尝试过在调试器中单步执行代码?显示更多代码。是否为CTower类定义了析构函数或赋值运算符?问题可能在init(&tower[0]);,还向我们展示该函数。正如我所写的,
init(CTower*tower)
CTower
的朋友,因此它可以访问其所有非常私人的成员在CTower课堂上,它对我完全有效。该死的,到底发生了什么?那是被诅咒的代码块吗?正如我所写的,
init(CTower*tower)
CTower
的朋友,因此它可以访问其所有非常私人的成员在CTower课堂上,它对我完全有效。该死的,到底发生了什么?那是被诅咒的代码块吗?