为什么我的傻卡片游戏课程不能相互交谈?

时间:2013-12-29 01:30:59

标签: c++

我曾试图在这里制作某种纸牌游戏,但是持有者/卡片的类别并没有向reciver / player提供正确的东西,我不知道如何解决这个问题。

以下是该计划:

 #include <iostream>

 using namespace std;

 class subclass // like a card
 {
 public:
    subclass();
    subclass(int x);
    int nummer;
    int getnummer();
 };

 subclass::subclass():nummer(0){}
 subclass::subclass(int x):nummer(x){}
 int subclass::getnummer()
 {
     return nummer;
 }

持有人类:

 class holder // like a cardpile
 {
 public:
    holder();
    subclass cardpile[2];
    subclass* pile; // a cardpile which has 2 cards, with nummber 1 and 2.
    subclass* getsubclass(int i); // take first or second card.
 };
 holder::holder()
 {
    subclass first(1*3);
    subclass second(2*3);
    pile=cardpile;
    pile=&first;
    pile++;
    pile=&second;
    pile--;
 }

 subclass* holder::getsubclass(int i) //1 eller 2.
 {
     return pile+i;
 }

reciver class / the player

 class reciver // like a player
 {
 public:
    subclass part_of_holder;
    reciver();
    void getsubclass( subclass* in); // give this card to player from this pointer
    void showinside(); // what card do player have
 };

 reciver::reciver():part_of_holder(){}

 void reciver::getsubclass( subclass* in)
 {
     part_of_holder=*in;
 }
 void reciver::showinside() // what card do player have
 {
     cout<< part_of_holder.getnummer();
 }

和主

   int main()
    {
        holder cardpile;
        reciver player;

        cout << "first card should be 1*3 and it is : " ;
        player.getsubclass(cardpile.getsubclass(0));
        player.showinside();
        cout << endl <<"first card should be 2*3 and it is : " ;
        player.getsubclass(cardpile.getsubclass(1));
        player.showinside();

        return 0;
 }

最后,我得到的只是不存在

2 个答案:

答案 0 :(得分:3)

holder::holder()
{
    subclass first(1*3);
    subclass second(2*3);
    pile=cardpile;
    pile=&first; // WRONG
    pile++;
    pile=&second;  // WRONG
    pile--;
}

上面两行不要做我怀疑你认为他们做的事情。 如果您尝试在cardpile中分配,则需要更多类似的内容: cardpile[0] = first*pile = first

可悲的是,他们不会工作,因为你没有复制构造函数。你也没有任何方法在构造后设置子类的nummer字段,所以你稍微注定了。 在get指令中添加一个setter函数,你可以这样写:

cardpile[0].setnummer(first.getnummer());

答案 1 :(得分:3)

这不会起作用

holder::holder()
{
   subclass first(1*3);       // create temporary
   subclass second(2*3);      // create another temoporary
   pile=cardpile;             // assign member pointer to another member!!!
   pile=&first;               // assign member pointer to temporary   
   pile++;
   pile=&second;              // assign member pointer to temporary   
   pile--;
}

// member pointer pile points to object that no longer exists!!!

基本上,一旦你创建了一个holder的实例,它的内部pile指针指向一个不再存在的对象,并且由于你的getsubclass方法返回了一个偏移,这个指针 - 因此任何取消引用它的尝试都可能是段错误。

老实说,最好从头开始,但确保将这些临时工具分配给成员阵列的方法是

 cardpile[0] = subclass(1*3);
 cardpile[1] = subclass(2*3);
 pile = cardpile;
然而,编写这段代码的方式并不是一个好的设计,当你对C ++的掌握更好时,我会建议从头开始。