我正在尝试用C ++实现模式状态。
我有我的客户:播放器 状态作为接口 和2状态:进出
这是我的In.h:
#ifndef ODA_IN_H
#define ODA_IN_H
#include <vector>
#include "Player.h"
#include "Hand.h"
using namespace std;
class In : public State {
public:
In(Player* player);
void doYouChange();
Card throwCard(int i);
void showHand();
void setHand(vector<Card> &other);
private:
Player* player;
Hand hand;
};
#endif
In.cpp:
#include <iostream>
#include "In.h"
using namespace std;
In::In(Player* player) {
this->player = player;
cout << player->getName() <<endl;
}
void In::doYouChange() {
string sth;
do {
cout << player->getName() << ", Do you want to leave for this round?(Yes/No)?";
cin >> sth;
} while (sth != "No" && sth != "Yes");
if (sth == "Yes") {
player->setState(player->getOut());
}
}
Card In::throwCard(int i) {
Card c = hand.getCard(i);
return c;
}
void In::showHand() {
hand.showHand();
}
void In::setHand(vector<Card> &other) {
hand.setHand(other);
}
因此构造函数可以写出名称,而doYouChange()方法则没有。后来它完全没有消息只是内存垃圾:/
我从另一个类调用doYouChange():
for (int i = 0; i < playersNb; ++i) {
players[i].doYouChange();
}
第一个没有名字的球员,第二个球员就打破了。
我完全不知道。我试图重新实现,但一切都没有帮助。
/ * ** * ** * ** * ** * ** * / 更新: 创建一个Player(作为构造函数中的Pattern State的客户端,我也初始化状态):
Player::Player(string n) {
name = n;
out = new Out(this);
in = new In(this);
this -> state = in;
}
在与for
相同的班级中,我在构造函数中添加了玩家:
players.push_back(Player(name));
答案 0 :(得分:0)
由于player
变为无效(/销毁)这一事实,很可能会发生此错误。
请考虑以下代码:
Player* player = new Player();
In inState(player); // will work
inState->doYouChange(); // will work
delete player;
inState->doYouChange(); // wont work
如果没有更多细节,我们无法为您提供具体的解决方案,但只是一般建议:
player
个对象player
对象真的被破坏了吗?doYouChange()
方法并检查player
对象