在C++中创建一个具有随机枚举类型的Card对象
Creating a Card object with a random enumerated type in C++
我目前正处于学习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
干杯。
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 随机生成一个没有重复元素的枚举数组 (C++)
- 以最新的C 的类型安全方式从枚举中随机选择元素
- 生成无连续重复的随机枚举
- C++ 随机将枚举类型分配给变量
- 如何在 c++ 中从枚举返回随机元素
- 在C++中创建一个具有随机枚举类型的Card对象
- 以常规方式选择有效的随机枚举值