在C++中创建一个具有随机枚举类型的Card对象

Creating a Card object with a random enumerated type in C++

本文关键字:枚举 随机 类型 对象 Card 一个 创建 C++      更新时间:2023-10-16

我目前正处于学习C++的初级阶段(来自Java背景),我很难理解为什么我的程序不起作用。我的程序的目标是能够创建一个Card对象,其中随机枚举的类型(步兵、骑兵或炮兵)将与该对象相关联。这意味着,每次我创建一张新卡时,这张卡都会有步兵、骑兵或炮兵的标签。

以下是我目前所拥有的:

卡片.h

#include <iostream>
#include <string>
using namespace std;
class Card
{
public:
    enum CardType
    {
        INFANTRY,
        CAVALRY,
        ARTILLERY
    };
    Card();
    Card(CardType type);
    CardType GetType();
    string toString(CardType type);
private:
    CardType type;
};

Card.cpp

#include "Card.h"
#include <iostream>
using namespace std;
Card::Card() { }
Card::Card(Card::CardType type) // creates a card with a random CardType
{ 
    type = static_cast<Card::CardType>(rand() % 3);
}
Card::CardType Card::GetType() 
{
    return type;
}
string Card::toString(Card::CardType type)
{
    switch (type)
    {
    case Card::CardType::INFANTRY:      return "Infantry";
    case Card::CardType::CAVALRY:       return "Cavalry";
    case Card::CardType::ARTILLERY:     return "Artillery";
    }
}

驱动程序.cpp

#include <iostream>
#include "Card.h"
using namespace std;
int main()
{
    Card c;
    c.toString(c.GetType());
}

Visual Studio能够构建我的程序,但在构建后立即冻结,所以我猜我做错了什么。

有没有一种更简单/有效的方法来实现我希望我的程序所做的事情?

我对C++还不太了解,所以任何指针都会有所帮助。

感谢您的投入!

问题出在对象创建上。

因为,您的卡类中有两个构造函数,即.Default和参数构造函数,当您使用Card c;语句创建对象时,会调用默认构造函数。因此,为了调用参数构造函数,必须使用Card c(Card::CardType::INFANTRY);

这里的问题是创建一个Card c,如果我们查看构造函数Card(),它不会初始化属性类型。

因此,在您的情况下,type有任何您可以想象的值,但肯定不在CardType枚举的范围内,因为C++中没有像Java中那样的默认值。

然后调用toString来切换(type)。您没有默认的大小写,类型也不是任何大小写值,所以函数实际上永远不会返回!

你可以像这样简单地修复:

string Card::toString(Card::CardType type)
{
    switch (type)
    {
        case Card::CardType::INFANTRY:      return "Infantry";
        case Card::CardType::CAVALRY:       return "Cavalry";
        case Card::CardType::ARTILLERY:     return "Artillery";
        default: return "ERROR";
    }
}

在任何情况下,从长远来看,您的构造函数应该是这样的:

Card::Card() { type = static_cast<Card::CardType>(rand() % 3); }
Card::Card(Card::CardType type) // creates a card with a random CardType
{ 
    this->type = type;
}

还有一件事可能是问题的一部分。C++中有一种叫做Include guard的东西,您可以在这里查看更多:https://en.wikipedia.org/wiki/Include_guard

干杯。