【问题标题】:How to dynamically add a key:value property to c++ class, then make it accessible as class.property如何动态添加键:值属性到 C++ 类,然后使其可以作为 class.property 访问
【发布时间】:2013-08-12 15:20:30
【问题描述】:

在 Python 中,我有一个标志类,我发现它非常有用。我是 C++ 的新手,似乎无法在 C++ 中复制这个 python 功能。与其提出不起作用的 c++ 代码,不如说这是我想要复制的内容,我需要一些关于去哪里、模板、虚拟或 ?? 的建议

要求是能够动态地改变类的成员,在 python 中,它修改了它自己的类的 dict 元素来实现这一点。

在python中:

导入系统 参数 = []

... 加载 args[] 与键:通过 sys.argv[] 循环的值 ... blah blah blah

类标志:

def __ init __(self, **args):

自我。 __ 字典 __.update(args)

现在我们启用 flag.dynamicproperty

flag = Flag(**dict(args))

使用示例: $ python script.py somedesc1 someval1 somedesc2 someval2

这样做是让我能够从命令行传入参数,如上所述,并即时分配任意数量的参数,然后通过 flag.property 访问(例如 flag.somedesc1)调用返回 somval1。考虑这一点的另一种方法是向 C++ 类动态添加 key:value 属性。

python代码中的使用示例:

如果 flag.somedesc1 != '10': 打印 someval1

我似乎无法做出类似的 c++ 工作。我研究了多态性,但这些必须动态分配,然后才能作为类的属性访问。

想法???当然 c++ 可以做到这一点,我只是不知道从哪里开始。

【问题讨论】:

    标签: class dynamic properties key-value


    【解决方案1】:

    好的,这是我制定的解决方案;尚未对其进行测试,但使用此格式应该足够接近以满足我的需求

    flag.find(文件名)

    枚举 { 文件名、工作人员、运行时 };

    类标志{

    vector<string> helplist;
    

    公开: int add(int argc, char *argv[], 字符串标志, 字符串值, ​​字符串描述) {

        string flagvalue;
        flagvalue = value;
        helplist.push_back(description);
        for (int i; i < argv.length(); i++) {
            if (argv[i]==flag) {
                flagvalue = argv[i+1];
            }
        }
    }
    void showhelp() {
        for (int i; i < helplist.length(); i++) {
            cout << helplist[i] << endl;
        }
    }
    

    };

    【讨论】:

    • 您通常应该在发布解决方案之前对其进行测试。
    【解决方案2】:

    不,您不能在 C++ 中执行此操作。在 C++ 中,类的成员是在编译时 100% 定义的。您不能在运行时添加任何内容。在 C++ 中执行此操作的方法是有一个成员变量 map&lt;string,string&gt; 保存键/值对,然后有一个函数 string getVariable(string) 返回字典中该键的值。

    【讨论】:

    • 最初我试图使用 vector 作为动态内容持有者,我只是想不出一种方法将它绑定回对象并为其命名。我会按照您的建议尝试使用 map 和 getVariable(string) 解决问题。
    • 你能想到任何方法来创建动态枚举吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多