C ++中的模式状态

时间:2013-11-27 13:24:08

标签: c++ design-patterns state

我正在尝试用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));

1 个答案:

答案 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对象
  • 考虑使用智能指针来克服所有权问题:请参阅std::shared_ptr(还有许多其他库可能提供更适合您需求的智能指针,例如Poco或Boost)