我无法弄清楚如何根据用户的选择正确创建对象。
在程序中,我询问用户他们想成为哪个职业——骑士还是法师。我接受输入“1”或“2”来代表骑士和巫师。
我做了一个 switch 语句,在案例 1 中,我声明了一个对象 Knight,对于 Wizard 也是如此。
我需要在 switch 语句之外使用这些对象,但我做不到。我试图通过制作“Player player”来制作“默认”对象;但是因为 Player 类有一个纯虚函数,所以我也不能那样做。
我如何有效地做到这一点?
这是我目前所拥有的:
int main()
{
std::string plyrName;
int input;
bool foo = false;
std::cout << "What is your name?\n";
std::cin >> plyrName;
std::cin.ignore(1000, '\n');
std::cout << "\nWelcome, " << plyrName << ". What class would you like to be?\n";
std::cout << "1. Knight.\n2. Wizard.\n";
std::cin >> input;
while (input != 1 && input != 2)
{
if (foo == true)
std::cout << "Please enter 1 for Knight and 2 for Wizard.\n";
if (!(std::cin >> input))
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "\n";
std::cout << "Only integers are allowed.\n";
}
else
std::cout << "\n";
foo = true;
}
switch (input)
{
case 1:
{
Wizard player;
break;
}
case 2:
{
Knight player;
break;
}
}
std::cout << "\nHere is your player information summary.\n";
std::cout << player.classType();
system("pause");
return 0;
}
我需要在创建后访问播放器对象,因为我想向用户输出他们选择的类别。 Knight 和 Wizard 类都有输出这个的函数。
编辑:我有一个跟进问题。在图中,Knight & Wizard 有一个静态变量“特殊攻击名称”。如何在主函数中访问这个变量?使用 unique_ptr 的解决方案意味着指针将指向基类 Player,从而不允许访问派生类成员,例如静态变量'特殊攻击名称'。我的设计有缺陷吗?
最佳答案
在你的例子中,因为你想完成多态性,你应该去寻找指针和引用。为什么?我强烈推荐这个漂亮的答案。 Why doesn't polymorphism work without pointers/references?
那么,您是否应该使用原始指针,例如 Player *
?
在几乎所有情况下,您永远不应该使用原始指针,尤其是当它指向动态内存时。仅仅是因为任何编程错误或异常都可能导致 delete
被跳过。
因此,我强烈建议您使用 C++11 中引入的智能指针,例如 unique_ptr
和 shared_ptr
,它们遵循 RAII 模式并保证取消初始化。
这是在您的案例中使用 unique_ptr
的示例。
#include <memory>
using PlayerPtr = std::unique_ptr<Player>;
using KnightPtr = std::unique_ptr<Knight>;
using WizardPtr = std::unique_ptr<Wizard>;
int main()
{
...
PlayerPtr playerPtr = nullptr;
switch (input) {
case 1: {
playerPtr = KnightPtr(new Knight);
}
break;
case 2: {
playerPtr = WizardPtr(new Wizard);
}
break;
}
// use playerPtr outside.
}
编辑:
正如 HTNW 正确指出的那样,您必须使用 std::make_unique
而不是使用 new
。但请记住,这是一个 C++14 概念。你必须有编译器支持它。
关于c++ - 有没有办法在条件语句中声明对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54404448/