我目前处于学习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 ++的了解还不多,所以任何指针都会有所帮助。
感谢您的投入!
答案 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
干杯。