是否可以引用随机类

Is it possible to reference random classes?

本文关键字:随机 引用 是否      更新时间:2023-10-16

有没有办法让用户输入引用随机类实例?我的意思是基于已经创建的那些?有点像开关,但没有写出开关中的每个实例?我希望我的代码更具通用性,以便其他人可以在不更改开关或代码的其他部分的情况下添加到其中。

我知道帖子的组织有点曲折,但我觉得这是组织我对帖子的想法的最佳方式,所以请耐心等待。在最底部的代码中,我做了一个指针来更改"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 = %dnLetter = %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;
}

我对代码片段和密集的文本有点困惑,但你描述的问题是一个相当普遍的问题。

要创建基于某个键类型的对象,您需要将抽象的工厂模式作为起点 - 可在所有好的教科书和您附近的更有信誉的wiki中找到。如果它看起来过于夸张,请不要推迟 - 与所有图案一样,您可以将其削减以满足您的需求。

从本质上讲,对于要创建的每种类型的对象,您都需要一个知道如何制作它的工厂。创建此相关对象集合所需的所有工厂都应共享相同的接口。

要选择正确的工厂来创建请求的对象类,您需要保留键映射,即指向工厂的字符串。该地图取代了您可能想使用的 if-else/开关。如果你想尽量减少打字并混淆你的敌人和朋友,可以使用单例来注册针对密钥的工厂,但请先阅读所有健康警告:

您所在城镇所有住宅的基类类住宅{公共:   虚拟 ~居住() {}   虚拟住宅(整数,字符字母);   虚拟输入() = 0;   虚拟 Leave() = 0;  //...在城镇住宅中您可以做的任何其他常见事情*/};一种住宅 - 随心所欲类 商铺 : 公共住宅{   虚拟商店(整数,字符字母)     : 住宅(数字、字母)   {/* 东西 */}   虚拟回车();   虚拟休假();};用于制造住宅类型的基本工厂类类 抽象住宅工厂{公共:   虚拟住宅工厂() {}   虚拟住宅 * 创建(整数,字符字母)= 0;};所有住宅工厂的收集和登记 - 方便的迈耶单身公寓住宅工厂级{公共:   静态住宅工厂和实例()   {       静态住宅工厂实例;       返回实例;   }   根据给定类型和其他参数创建住宅 - 考虑智能指针而不是此处显示的原始指针   Dwelling * Create(std::string const & dwelling dwellingType, int number, char letter)   {      假设我们有一个匹配的工厂,让我们成为一个住宅。      显然,在现实世界中需要一些错误检查      返回 myAbstractDwellingFactoryMap[dwellingType]。创建(数字,字母);   }   void Register(std::strinf const & dwellingType, AbstractDwellingFactory const & fact)   {      myAbstractDwellingFactory[dwellingType] = &fact;   }私人:   DwellingFactory() {}   类型映射的实际键   std::map myAbstractDwellingFactoryMap;};普通混凝土工厂模板<类型名称居住类型>类混凝土住宅工厂:公共抽象住宅工厂{公共:   ConcreteDwellingFactory(std::string const & dwellingType)   {      DwellingFactory::Instance().注册(住宅类型,*此);   }   工厂函数 - 注意我们可以在这里返回指向派生类型的指针 - 查找"协变量返回类型"   住宅类型 * 创建(整数,字符字母)   {      返回新的住宅类型;   }};要支持的每种住宅类型的工厂实例静态混凝土住宅工厂<商店>商店工厂("商店");void SomeFunction(){   标准::字符串住宅类型;   整数;   字符字母;   标准::CIN>>住宅类型>>数字>>字母;   Dwelling *requestDwelling(DwellingFactory::Instance().创建(住宅类型,数字,字母));   请求住宅->输入();等等}