具有属性的对象,该属性可以对同一属性进行不同类型的类型
Object with attribute that can different type for the same attribute
我正在尝试找出c ++程序的最佳方法:
我需要制作一个名为特征的对象。这家伙有4个属性:
- 字符串名称(只是名称)
- ? 类型(它是什么类型的特征。可以是数字的,也可以是描述性的)
- ? 范围(数字 - 最小值和最大值
描述性 - 选项)
- ? 值(实际选择的值可以是 int 或字符串,具体取决于类型)
如果我在Java中,我会创建一个带有两个子对象的对象类型:数字和描述。每个都将具有适当的范围,并以适当的格式存储值。
两者的示例:
名称:温暖
类型:数字
范围:最小 1 最大 5
值:2
名称:样式
类型:描述性
范围:简约摄影
价值:简约
我不知道在 c++ 中执行此操作的最佳方法是什么。
我应该查看模板吗?因为如果是这样,我无法弄清楚如何使用它们。
如果你愿意,你可以做与Java相同的事情。
struct Type {
std::string Name;
};
struct Numeric : Type {
int value, min, max;
};
struct Descriptive : Type {
std::string value, min, max;
};
但是,在决定如何实现特征之前,您必须更好地定义如何使用它以及所需的接口。例如,上述内容使将 Type 对象用作多态对象并不容易使用。您必须手动检查类型指针是否指向数字或描述性并采取相应操作。
获得多态性的一种方法是C++是使用虚拟方法:
struct Type {
~Type() {} // virtual destructor
virtual void do_something() = 0; // pure virtual function. Derived classes must provide an implementation
std::string Name;
};
struct Numeric : Type {
virtual void do_something() {
std::cout << "Numeric value: " << value << " (" << min << ',' << max << ")n";
}
int value, min, max;
};
struct Descriptive : Type {
virtual void do_something() {
std::cout << "Descriptive value: " << value << " (" << min << ',' << max << ")n";
}
std::string value, min, max;
};
现在,当您在Type *
上调用do_something
时,它将找出动态类型的正确方法并调用它。
C++有几种方法可供选择:
- 遗产。不仅仅是Java可以做到这一点。如果这是你在Java中使用的方法,我不明白为什么你不能在C++中做同样的事情。
- 模板。这种方法对应于Java泛型。
- 工会。我不认为有一个对应的Java,可能值得研究。
如果没有进一步的细节,就不可能给出很好的论据,为什么你应该更喜欢其中一个。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 变量(或属性)可以等于类型吗?
- C++类型的属性是继承的吗
- 如何在一个属性中动态存储基元类型
- C++将两个不同类型的向量的属性连接到新的向量中
- 将提升属性映射与捆绑类型一起使用
- 使用类属性调用具有非类型模板参数的模板函数
- 如何在提升图形库中获取属性的类型
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 我创建了deque<CObject*>并添加了不同类型的元素。如何更改此元素的属性?
- 应用于类型别名声明的 [[maybe_unused]] 属性的语法
- 访问用户定义类型的数组的特定属性
- 精神X3,如何获得属性类型以匹配规则类型
- 具有相似属性的不同数据类型的模板
- 创建具有受限属性的类型
- 单声道嵌入:如何在 C/C++ 中访问属性的类型
- Qt/C++ 如何迭代给定类对象的QMetaObject的属性/数据类型?
- 属性的类型随C++中的继承而更改