[英]Is there a way to declare objects within a conditional statement?
我无法根据用户的选择搞清楚如何正确创建对象。
在程序中,我问用户他们想要成为他们的班级 - 骑士或巫师。 我输入'1'或'2'代表骑士和巫师。
我做了一个switch语句,在case 1中,我声明了一个对象Knight,对于Wizard也是如此。
我需要在switch语句之外使用这些对象,但我不能。 我试图制作一个'默认'对象,制作'玩家播放器'; 但由于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有一个静态变量'特殊攻击名'。 如何在main函数中访问此变量? 使用unique_ptr的解决方案意味着指针将指向基类Player,因此不允许访问派生类成员,例如静态变量'special attack name'。 我的设计有缺陷吗?
在你的情况下,因为你想要完成多态,你应该去指针和引用。 为什么? 我强烈推荐这个美丽的答案。 为什么没有指针/引用时多态性不起作用?
那么,你应该寻找一个像Player *
这样的原始指针吗?
在几乎所有场景中,你都应该永远不会选择原始指针,特别是当它指向动态内存时。 只是因为任何编程错误或异常都可能导致delete
被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概念。 您必须具有编译器支持。
如果你在switch case范围内创建你的变量,只要你离开那个范围引导你到UB就会被删除,所以你把它声明为指针所以它可以比条件语句更长,即:你之前将它声明为基类指针你把它给它指向条件陈述里面的地方
#include<memory>
int main()
{
std::string plyrName;
int input;
bool foo = false;
//create your player ptr
std::unique_ptr<Game_Object> player;
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:
{ // initialize it and it would work perfectly as you intend
player = std::make_unique<WIZARD>();
break;
}
case 2:
{ //****
player = std::make_unique<KNIGHT>();
break;
}
}
std::cout << "\nHere is your player information summary.\n";
std::cout << player->classType();
system("pause");
return 0;
}
如果我错了,有人会纠正我,但是对象只在它们创建的范围内有效,所以一旦你离开那个switch语句,那些对象就不再可访问了。
您应该在switch语句之外声明一个GAME OBJECT类对象,然后创建向导或骑士(因为这两个类都继承了GAME OBJECT)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.