C++ 基于SDL的河内塔游戏中的奇怪问题
我想创建一个基于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()
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;
}
但在析构函数或构造函数部分也修复类会更好除非你被特别要求不要使用一个STD::向量,那么我会考虑改变你的代码来使用一个代码,因为它使生活变得简单很多。 关于您的特定代码示例。由于缺少复制构造函数和赋值运算符,您将遇到问题,因为编译器生成的默认值不适合您的类
我也会考虑摆脱朋友功能空缺(CTA塔*塔),因为这确实不是很好的练习。< /P>
<>我会提供一个代码示例,但是这个问题被标记为“家庭作业”,所以我会让你自己做研究。 除非你被特别要求不要使用一个STD::向量,那么我会考虑改变你的代码来使用一个,因为它使生活变得简单很多。 关于您的特定代码示例。由于缺少复制构造函数和赋值运算符,您将遇到问题,因为编译器生成的默认值不适合您的类
我也会考虑摆脱朋友功能空缺(CTA塔*塔),因为这确实不是很好的练习。< /P>
我会提供一个代码示例,但是这个问题被标记为“家庭作业”,所以我会让你自己做研究。我认为你的
}类的code>应该在方法的末尾,也就是方法的末尾。您也可以在print方法上放置一个断点,并找出floorNum
的值。您是否介意同时显示init
函数?另外,您是否尝试过在调试器中单步执行代码?显示更多代码。是否为CTower类定义了析构函数或赋值运算符?问题可能在init(&tower[0]);,我想你的}类的code>应该在方法的末尾,也就是方法的末尾。您也可以在print方法上放置一个断点,并找出floorNum
的值。您是否介意同时显示init
函数?另外,您是否尝试过在调试器中单步执行代码?显示更多代码。是否为CTower类定义了析构函数或赋值运算符?问题可能在init(&tower[0]);,还向我们展示该函数。正如我所写的,init(CTower*tower)
是CTower
的朋友,因此它可以访问其所有非常私人的成员代码>在CTower课堂上,它对我完全有效。该死的,到底发生了什么?那是被诅咒的代码块吗?正如我所写的,init(CTower*tower)
是CTower
的朋友,因此它可以访问其所有非常私人的成员代码>在CTower课堂上,它对我完全有效。该死的,到底发生了什么?那是被诅咒的代码块吗?