使用类制作的列表

时间:2014-03-01 21:27:03

标签: c++

好吧,我刚开始学习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错误。

2 个答案:

答案 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);