gpt4 book ai didi

具有不同返回类型的 C++ 多态函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:59 25 4
gpt4 key购买 nike

我正在创建一个属性类,它将唯一键和任意值存储为字符串(加上一个可选的注释字符串,以便在写入配置文件时使用)。目前我正在使用创建一个包含原始字符串的基本属性类的方法,然后将其子类化为特定于类型的属性 - 例如。一个 IntProperty,它实现了一个将字符串转换为 int 的 getValue() 函数——以避免每次我想读取它时都必须手动从字符串转换属性值。这些子类使用 getPropertyType(),一个在基类中定义并在每个派生类中重写的虚函数,返回一个枚举值来标识它们持有的属性类型,基类返回一个“无”标识符。

(作为旁注,我避开了模板,因为我使用的是 Qt,它所需的接口(interface)宏不支持模板化对象。如果值得使用模板,我可能会放弃使用接口(interface)的想法。)

我的意图是通过从基本属性类中继承它们并允许基本属性指针数组来允许多种不同类型的属性(字符串、整数、浮点...)的列表。但是,我遇到了一个问题,即从其中一个派生类中将属性作为特定类型提取出来变得非常尴尬,因为指向基类的指针显然不知道派生类中新定义的 getValue 函数。我只能选择从基类中提取字符串并手动转换,或者将基类指针强制转换为正确的派生类指针。第一个选项通过要求我手动进行转换而使子类化变得无用,第二个选项听起来像是编码的噩梦,因为每次我想计算出指向哪个指针时,属性标识符值都会涉及一个大的 switch 语句投向。

解决这个问题最明智的方法是什么?我想让属性值的检索尽可能简单——即。从从数组获取基类指针到保存属性值的正确类型拷贝,我可以使用尽可能少的样板代码。换个角度考虑这个问题是否值得 - 有多个强类型的属性类,它们都支持使用字符串获取和设置它们各自的值?

最佳答案

这个呢? (未经测试,但你应该明白)

class BaseType {
public:
virtual void getValue(string &s) { s = ""; };
virtual void getValue(int &i) { i = 0; };
virtual void getValue(double &d) { d = 0.0; };
};

class IntType : public BaseType {
public:
virtual void getValue(string &s) { s = to_string(myvalue); };
virtual void getValue(int &i) { i = myvalue; };
virtual void getValue(double &d) { d = static_cast<double>(myvalue); };
private:
int myvalue;
};

class DblType : public BaseType {
public:
virtual void getValue(string &s) { s = to_string(myvalue); };
virtual void getValue(int &i) { i = static_cast<int>myvalue; };
virtual void getValue(double &d) { d = myvalue; };
private:
double myvalue;
};

class StrType : public BaseType {
public:
virtual void getValue(string &s) { s = myvalue; };
virtual void getValue(int &i) { i = stoi(myvalue); };
virtual void getValue(double &d) { d = stod(myvalue); };
private:
string myvalue;
};

关于具有不同返回类型的 C++ 多态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17458729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com