Почему мои глупые занятия по карточной игре не могут говорить друг с другом?

0

Я попытался сделать какую-то карточную игру здесь, но классы для держателя/карточки не дают правильные вещи ребилеру/игроку, и я не знаю, как разобраться в этом.

Вот программа:

 #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;
 }

класс ресивера/игрок

 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;
 }

В конце концов, все, что я получаю, - это бессмысленность

  • 0
    слишком много кодеееее ...
  • 0
    Правильное слово - receiver .
Показать ещё 4 комментария
Теги:

2 ответа

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 возвращает смещение этого указателя, поэтому любая попытка разыменовать его, вероятно, будет segfault.

Честно говоря, вам лучше начать все сначала с нуля, но способ гарантировать, что вы назначаете эти временные ряды вашему массиву-члену, будет

 cardpile[0] = subclass(1*3);
 cardpile[1] = subclass(2*3);
 pile = cardpile;

однако способ написания этого кода не является хорошим дизайном, и я бы посоветовал начать с нуля, когда лучше понять ваше понимание C++.

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.

К сожалению, они не будут работать, поскольку у вас нет конструкторов копирования. У вас также нет способа установить поле класса подкласса, когда оно было построено, поэтому вы немного обречены. Добавьте функцию setter в инструкцию get, и вы можете написать следующее:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню