【发布时间】:2013-10-16 00:17:20
【问题描述】:
有没有办法让用户输入引用随机类实例?我的意思是基于已经创建的那些?有点像一个开关,但没有写出开关内的每个实例?我希望我的代码更加通用,以便其他人可以在不更改开关或代码其他部分的情况下添加代码。
我知道帖子的组织方式有点曲折,但我觉得这是整理帖子想法的最佳方式,所以请多多包涵。在最底部的代码中,我创建了一个指针来更改“test1”实例中的变量。我希望能够让程序能够获取用户输入来选择哪个类,然后在那里进行更改。我知道这种语法不起作用,但例如:
class test {
public:
int number;
int letter;
}
test classTest; //to get user input of which class he wants to select
//to change a variable
cin >> classTest; //user inputs choice
test * classPointer; //pointer to variables
cin >> classPointer -> number;
cin >> classPointer -> letter;
//where classTest is actually not a normal instance, just a way to get user
//input to select which class instance variables he'd like to change
这里是我的问题开始和这个问题源于的一点背景。如果您不关心它/需要它来回答我,您可以跳过它。我正在编写一个 RPG 游戏来练习我在 C++ 中所学的内容,并且我想让我编写的代码相当通用。例如,如果我有一个类可以创建某些在“城镇”中通用的对象。比如物品商店、旅馆等。在战斗系统中你可以选择使用物品。在该项目类别中,应该只列出可用的项目。没问题,我可以写大量的 if 和开关和布尔值——但是我不想为战斗系统中的每个项目都写所有这些,我想要某种机制来为我做到这一点。我相信如何调用指针的一些技巧将解决我的问题。但是,说了这么多,请不要被我的背景故事所牵扯。它只是为了帮助您了解我的思维过程,如果它不能解决这个问题,就这样吧,无论如何我都需要知道这些信息以供参考。
#include <iostream>
#include <stdio.h>
class test {
public:
int number;
char letter;
void function() {
printf("Number = %d\nLetter = %c", number, letter);
}
test() {}
test(int a, char b) : number(a), letter(b) {}
};
int main()
{
test* pointer;
test test1(1, 'c');
pointer = &test1;
test1.function(); //output initial result
printf("\nEnter a new number: ");
std::cin >> pointer -> number; //change number
printf("Enter a new letter: ");
std::cin >> pointer -> letter; //change letter
test1.function(); //output changed result
return 0;
}
【问题讨论】:
-
您需要创建某种查找表,以某种方式将字符串映射到类。如果你可以使用 C++11 的 lambda 特性,你可能会以一种相当干净的方式做到这一点,否则你需要函数指针。
-
我完全不明白为什么你将
test* pointer和test test1视为基本相同的东西。如果需要指针,请使用new分配器,否则使用基于堆栈的实例。两者都用没有多大意义。 -
@tadman 这就是我学会使用指针的方式。我没有意识到实例 test1 与该程序中的指针几乎相同。你能详细说明你的意思吗?如果这意味着什么,我写了 pointer = &test1 作为一个例子。我真正想要的不是 &test1 而是 &userInput。
-
听起来像是基本的多态性。这些类是否需要在运行时可扩展,例如应用程序插件?如果是这样,您需要一个工厂模式来创建与提供的基本类型兼容的对象。如果没有,那么您仍然可以使用相同的模式,但它会变得更容易。即使我只有两种类型,我仍然更喜欢通过基类指针或引用而不是条件的多态行为。让 vtable 成为你的 switch 语句。
-
通常你有类似
test* p = new test(...)或test s(...)的东西,你想要一个明确的指针,你打算在本地范围之外使用它,或者你不在乎和一个堆栈-分配的对象很好。调用p->fn()与s.fn()相同。为了有效地学习 C++,您需要知道何时需要指针,以及如何分配此分配的“所有权”,何时可以使用“拥有”它的容器类,以及何时使用堆栈分配的本地.为不同的变量混合使用指针、引用和局部变量,但要与你对任何一件事的方法保持一致。
标签: c++ class pointers reference