在C ++中使用随机枚举类型创建Card对象

时间:2015-11-26 06:04:03

标签: c++ enums

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

这是我到目前为止所做的:

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";
    }
}

Driver.cpp

#include <iostream>
#include "Card.h"

using namespace std;

int main()
{
    Card c;

    c.toString(c.GetType());
}

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

是否有更简单/有效的方法来实现我希望我的程序做什么?

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

感谢您的投入!

2 个答案:

答案 0 :(得分:0)

问题出在你的对象创建上。

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

答案 1 :(得分:0)

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

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

然后你调用toString做切换(类型)。你没有默认情况,而且type不是任何case值,所以函数实际上永远不会返回!

你可以像这样轻松解决这个问题:

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

干杯。