【问题标题】:Printing out a class objects variables from a stack从堆栈中打印出类对象变量
【发布时间】:2015-09-03 10:49:13
【问题描述】:

我正在制作二十一点游戏作为练习的一种方式。起初我使用了一个数组,但决定尝试使用堆栈来制作一个版本,因为我可以使用堆栈的做法。

我创建了一个扑克牌类。

class PlayingCard
{
   private: 
   int value;
   char suit;

   public:
   PlayingCard();

   PlayingCard(int val, char type)
   {
       value = val;
       suit = type;
   }

   int getValue()
   {
       return value;
   }

   char getSuit()
   {
      return suit;
   }

   void setValue(int val)
   {
      value = val;
   }

   void setSuit(char type)
   {
      suit = type;
   }
};

然后我创建了该类的堆栈。

stack<PlayingCard> deck1;

例如,现在我将以下内容压入堆栈:

deck1.push(PlayingCard('C', 9));

首先,我的理解是正确的吗?将 PlayingCard 对象推入堆栈,花色为“C”(俱乐部),值为 9?

我现在遇到的问题是当玩家从堆栈中“抽牌”时打印出花色和价值值。

我不能只做“cout

我试着用这个函数来打印出值:

void prints(PlayingCard tester)
{
    cout << tester.getSuit() << " " << tester.getValue() << "\n"; 
}

调用如下所示:

prints(deck1.top());

但是,这并没有给我正确的输出。有什么建议吗?如果我应该只使用向量或数组,那么我想我可以这样做,但我认为使用堆栈会更好,因为堆栈可以更好地模拟实际的一副纸牌如何从顶部弹出和抽出一张牌的甲板。

【问题讨论】:

  • 验证PlayingCard(int val, char type)deck1.push(PlayingCard('C', 9));
  • 您是否在输出中看到“67” - 那是因为您的构造函数中的参数调用错误。
  • 是的,我看到了很多 67。当我第一次运行程序时,我看到了 67s,奇怪的是,不同卡片套装的实际符号与我分配给它们的字符相反。谢谢你和另一张海报指出了混淆。一旦我调整了我的构造函数,一切正常。

标签: c++ class stack


【解决方案1】:

您可以考虑更多的 C++/OOP 方法,方法是在您的 PlayingCard 类中添加一个方法“show()”,如下所示:

class PlayingCard
{
   private: 
   int value;
   char suit;

public:
//...

std::string show()
{
   std::stringstream ss;
   ss << "  " << value << "  " << suit << std::endl;
   return (ss.str());
}

// ... 
};

然后,在你的代码中,在你声明了一个牌组之后,并把一些牌放进去......

// ...

deck1.push(PlayingCard('C', 9));
// more cards ...

// to show the entire deck, you would want to be able to do something 
// like:
for (size_t i=0; i<deck1.size(); ++i)         // for each card
    std::cout << deck[i].show() << std::endl; // invoke show()

编辑:

哎呀。

嗯,不,堆栈不是向量。但是这个想法是一样的……遍历你的牌组中的每个条目,然后调用 show 方法。由于您还没有完成设计,您将不得不决定如何完成对每个堆栈项的访问。

【讨论】:

  • 如果这是更正确的方法/遵循 C++ 的 OOP 最佳实践的方法,那么我一定会努力切换到这个。您是否暗示我应该使用数组而不是堆栈(因为我认为您在示例中使用了数组)?编辑:啊,好吧。明白了。
  • 我认为您正在打印的对象应该自己打印。任何其他代码都没有理由知道打印(或显示())卡片的含义。这是 sw 工程理念的一部分,以最小化耦合,最大化内聚。同样,您还应该考虑为您的对象重载运算符
  • 关于向量与堆栈,我不知道您的设计将走向何方。堆栈是一种后进先出的结构和行为。如果这适合您的其余设计,请继续使用堆栈。您可能会考虑在打印时使用矢量作为中间容器,但将卡片从一个堆栈移到另一个堆栈并返回(以保持顺序)似乎也可以。
  • 我还没有在堆栈上看到它,但是您可能会考虑添加一个新的堆栈概念。以某种方式访问​​每个堆栈元素,而无需清空堆栈。也许std::stack有这样的东西,我现在不记得了。
  • 我的计划是先从二十一点开始,然后转向更难的纸牌游戏,例如扑克。我真的只是使用了堆栈,因为我认为它与实际的一副纸牌最相似,而且我可以使用堆栈练习。另外,我收到了您发布的 show() 函数建议。我比以前使用的公共方法更喜欢它。谢谢。
【解决方案2】:

首先,我的理解是正确的吗?将 PlayingCard 对象推入堆栈,花色为“C”(俱乐部),值为 9?

查看你的函数使用情况

deck1.push(PlayingCard('C', 9));

和定义

PlayingCard(int val, char type)
{
    value = val;
    suit = type;
}

应该是

deck1.push(PlayingCard(9, 'C'));

或更改函数定义

PlayingCard(char type, int val)

【讨论】:

  • 哎呀。谢谢你赶上那个搞砸了。我快速更改了构造函数并运行它,现在我的打印功能得到了正确的输出。
【解决方案3】:

验证PlayingCard(int val, char type)deck1.push(PlayingCard('C', 9));

我不能只做“cout

是的,你可以。重载operator &lt;&lt;

class PlayingCard
{
    ...
    friend ostream & operator << (PlayingCard &card);
};
ostream &operator << (PlayingCard &card)
{
    out << tester.getSuit() << " " << tester.getValue();
    return out;
}

//cout << deck.top() << endl; should work

【讨论】:

  • 重载
  • 我认为cout &lt;&lt; card &lt;&lt; endl;print(card) 更简洁。此外,前者明确告诉您输出发送到哪个流。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 2018-10-30
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2011-12-01
相关资源
最近更新 更多