Я попытался сделать какую-то карточную игру здесь, но классы для держателя/карточки не дают правильные вещи ребилеру/игроку, и я не знаю, как разобраться в этом.
Вот программа:
#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;
}
В конце концов, все, что я получаю, - это бессмысленность
Это не сработает
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++.
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());
receiver
.