c++ - 有没有办法在条件语句中声明对象?

标签 c++ object if-statement

flowchart

我无法弄清楚如何根据用户的选择正确创建对象。

在程序中,我询问用户他们想成为哪个职业——骑士还是法师。我接受输入“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_ptrshared_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/

相关文章:

c++ - 如何为函数中的 vector 参数指定默认值

c++ - 仅获取整数作为输入,代码未按预期工作

c++ - 在值上具有类似队列属性的关联容器

javascript - 访问数组中的某个对象

java - 循环验证直到用户选择正确的选项,如果没有选择正确的选项则继续循环

c++ - OpenCV idft() 和 MATLAB ifft2 的结果不匹配

javascript - Javascript 中更短的 if 语句

javascript - 如何使用扩展语法 es6 进行简化

java - 在 if 语句中返回导致无法访问的代码错误

javascript - If/Else 语句仅在 if 代码运行,即使 else 条件满足