2014-03-01 35 views
0

那么,我刚开始学习C++,我似乎有一些问题。具体来说,我必须制作一个重新制作游戏音乐椅的程序。对于这个我应该做两个班,一个名为成员,将有一个球员的位置和他们的身份证号码,并指向下一个(最后一名成员应指向第一。)。其次是一个名为连锁的类,它会指向第一个成员,并且也有一些可能的玩家。对于初学者,我应该创建一个基于参数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由本身,整个事情崩溃调用。任何帮助都很好。

编辑:当试图调试它,它似乎还有当membber_使用Member2有叫Member2 isnide之后segmentantion故障。

+2

您的指针不指向任何东西。你需要使用动态内存分配或类似unique_ptr的处理它。 – user1937198

+0

你是什么意思的“自己调用”? – Ashalynd

+0

另请参阅http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice关于为什么您不应该在代码顶部使用名称空间标准。 – user1937198

回答

0

表达式pos++使用后增量,其产生原始值pos作为表达结果。因此在递归调用中pos参数不会增加。因此,你得到无限递归,如果你幸运的话崩溃,当它用完了所有堆栈空间。

+0

虽然当我打印成员_->位置和成员_->编号后成员_-> positin = pos;构件_->数= ID;部分它只在member2从链中调用时才打印出来,并且在打印任何东西之前它会崩溃....如果它处于无限递归中,它不应该在崩溃之前无限打印东西吗? –

+0

@ George0X:您所显示的代码具有无限递归,如此答案中所述。我不知道你正在谈论的代码,它有一些输出语句。由于代码有许多问题,包括使用不确定指针值的UB,即使无限递归问题得到解决,它也可能会崩溃。 –

0

有几个问题(至少)与代码:

1)

Member *First_member; 

只是一个声明。把它变成一个定义,实际上你需要分配内存,e.g:

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_参数是否为NULL(在这种情况下代码确实会崩溃,因为它试图像使用数据一样处理垃圾)。

3)Member2也应该照顾有关链中的下一个元素分配内存,例如:

if (member_->next_member == NULL) { 
    member->next_member = new Member; 
} 
Member2 (member_->next_member, pos++, rand(), N);