好吧,我刚开始学习c ++,我似乎遇到了一些问题。具体而言,我必须制作一个重新创建游戏音乐椅的程序。为此,我应该制作两个类,一个名为成员,具有玩家的位置和他们的id号,并指向下一个(最后一个成员应该指向第一个。)。其次是一个名为chain的类,它指向第一个成员并且还有exsting玩家的总数。对于初学者,我应该根据一个参数N创建一个链,它会给每个成员一个随机的id并定位它们,当然也会将权力相互联系起来。
我写的是
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Member{
public:
int position, number;
Member *next_member;
void Member2( Member *member_, int pos, int id,int N){
if(pos <= N){
member_->position=pos;
member_->number=id;
Member2 (member_->next_member, pos++, rand(), N);
if(pos == N)
member_->next_member = this;
}
}
};
class Chain {
Member *First_member;
int size;
public:
Chain ( int N){
size = N;
srand(time(NULL));
First_member->Member2(First_member, 1 , rand(), N);
}
};
和主要叫做链。
问题是当Member2被自己调用时,整个事情就会崩溃。任何帮助都很好。
编辑:当试图调试它时,似乎在Member2调用Member2 isnide it之后使用membber_时出现了segmentantion错误。
答案 0 :(得分:0)
表达式pos++
使用后增量,它会将pos
的原始值作为表达式结果。因此,pos
参数在递归调用中不会增加。因此,你得到无限递归,如果你在所有堆栈空间用尽时幸运地崩溃了。
答案 1 :(得分:0)
该代码存在若干问题(至少):
1)
Member *First_member;
只是一个声明。要将其转换为定义,您需要实际分配内存,例如:
Member *First_member = new Member;
并最终将其释放,例如(不一定是最好的方法,但我的C ++有点生疏):
void free(Member* _member) {
Member* _next = _member->next_member;
if (_next!=NULL) free(_next);
delete _member;
}
Member* First_member = new Member;
// some code ...
free(First_member);
2)更严重的问题是你的Member2方法:它不检查它的Member * member_参数是否不是NULL(在这种情况下代码确实会崩溃,因为它试图使用垃圾就好像它是数据一样)。
3)Member2还应该注意为链中的下一个元素分配内存,例如:
if (member_->next_member == NULL) {
member->next_member = new Member;
}
Member2 (member_->next_member, pos++, rand(), N);