我曾试图在这里制作某种纸牌游戏,但是持有者/卡片的类别并没有向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;
}
最后,我得到的只是不存在
答案 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 ++的掌握更好时,我会建议从头开始。