来自C++;在for循环中打印时,卡的矢量没有打印出来? 我正在为C++类编写Black Jack模拟器。以下是我在c++11中编译的相关类/结构:

来自C++;在for循环中打印时,卡的矢量没有打印出来? 我正在为C++类编写Black Jack模拟器。以下是我在c++11中编译的相关类/结构:,c++,stdvector,C++,Stdvector,class DeckFactory:使用名为GetDeck()的静态方法,该方法返回一个包含52张卡的向量 类别卡:在命名空间Casino中定义的一个类,表示一张卡,Ptr是属于typedef卡的卡的公共成员* 类结构套件:在卡中定义的类,也用于声明卡的成员,如下所示的套件常量和套件。 枚举SuiteType:在类结构套件中定义的枚举。它有四个成员俱乐部、钻石、红心、黑桃。 类FaceCard:卡的子类,其FaceRank成员声明如下FaceRank const\u rank。 枚举类FaceR

class DeckFactory:使用名为GetDeck()的静态方法,该方法返回一个包含52张卡的向量
类别卡:在命名空间Casino中定义的一个类,表示一张卡,Ptr是属于typedef卡的卡的公共成员*
类结构套件:在卡中定义的类,也用于声明卡的成员,如下所示的套件常量和套件。
枚举SuiteType:在类结构套件中定义的枚举。它有四个成员俱乐部、钻石、红心、黑桃。
类FaceCard:卡的子类,其FaceRank成员声明如下FaceRank const\u rank。
枚举类FaceRank:有以下成员:杰克、皇后、国王。
类AceCard:卡的子类

问题:当我在DeckFactory类的GetDeck()方法中创建一个牌组并用52张牌填充它时,一切正常并返回。然而,当我打印出向量中每个对象的信息时,它并没有打印出每个对象的完整信息。事实上,看起来好像有些卡被添加了两次,这很奇怪,因为每个卡都必须是唯一的,我在方法GetDeck()中手动将唯一的卡添加到了牌组中。这是输出,下面是向量组打印中涉及的每个类的相关代码

输出

主要方法

DeckFactory GetDeck()方法

分别为卡、套件、FaceCard和AceCard设置字符串方法: 变量_suite是Card的成员,类型为suite。Rank()是一个只检索卡2,3,4的等级的方法。。。杰克、皇后、国王10张,王牌11张。 如果需要更多信息,请询问。谢谢你的帮助

卡、套件、FaceCard和AceCard的构造函数
问题在于
卡的
数据成员的
套件是
常量套件&
。如果你 将类型更改为
const Suite
,我怀疑您将获得所需的行为

当你像这样构造一张新的
卡时

deck.向后推(新赌场::卡(2,赌场::卡::套房::俱乐部);


请注意,将有一个临时
套件
对象使用枚举值
CLUBS
构造。该临时对象的生存期仅在构造函数中,因此必须将其复制或移动到
对象中。否则,
\u套件
仅指可以覆盖的内存位置在屏幕截图中发布源代码不是一个好主意。你实际上是一个一个手动添加所有的卡片。考虑修改到一个循环(+枚举)。关于你的问题-请添加卡片构造器。@ Leeor:我同意。@ OP:你的问题可能在<代码>卡<代码> cTor(及其衍生物)。此外,您可能希望将
default
子句添加到
switch
es中,以便能够捕获和处理(设置断点等)无效情况(用于调试目的)另外,也许不是你的实际问题,而是一个巨大的红旗——你在主循环中使用一个整数和向量迭代器的相同变量。考虑改变<代码>:ST:::向量:I/SCORE > >代码> IT < /代码>。加分,因为你使用C++ 11,只写它为“代码> Auto it =…< /Calp> @ FGHARO91发布源”。屏幕截图中的代码不是一个好主意,因为人们无法引用和/或更正错误片段。我在Card类中去掉了“of”套件中的“&”,现在所有常规的卡片都与Three套件一起以Three等级输出。但是Jack、Queen、King和Ace不会随套件一起打印出来。也许我需要这样做修改一下这些子类的继承代码。是的!谢谢你的回答!我去看了hpp文件,其中有Card、FaceCard和AceCard,所有这些类中都有一个_suite变量,声明为suite const&。我去掉了所有的&s,现在它工作了!再次感谢。奇怪的是,代码是由老师已经这样编码了:或者,如果我在课堂上保留&这个变量,我如何从call变量而不是引用中复制值?deck.push_back(new Casino::Card(2,Casino::Card::Suite::CLUBS));我如何将Suite中的值复制到我的_Suite变量中,并用&?声明它只是出于好奇?请注意,如果您公开继承
AceCard
FaceCard
中的
Card
,它们应该是
Card
的成员。如中所述,它们不应该有自己的
\u Suite
成员,它们应该使用<代码>卡> <代码>,您已经正确调用了<代码>卡>代码>的构造函数,所以您可以在<代码> ACCARARD 中去掉<代码>套件< /代码>成员。对于<代码> FACCEARD ,考虑摆脱<代码> FACERANK < /代码>,只使用其他的int,调用<代码>卡< /COD>的构造函数,如<代码> >AceCard
。至于如果成员变量上有&该怎么办,一种方法是让另一个变量存储数据,让带有&的成员变量只引用它,但这显然是没有用的。另一种方法是将数据存储在堆中,然后您与成员一起引用堆分配的数据。可以使用这个方法d以保持对象的大小更小,但即使如此,成员也应该是
std::unique_ptr
,或
std::shared_ptr
,而不是裸引用。