具有属性的对象,可以为同一属性使用不同的类型

时间:2012-04-18 19:57:55

标签: c++ class object

我正在试图找出c ++程序的最佳方法:

我需要创建一个名为Character的对象。这家伙有4个属性:
- 字符串名称(只是名称)
- ?类型(它是什么类型的特征。可以是数字的或描述性的)
- ?范围(数字 - 最小和最大
                描述性的 - 选项)
- ? value(实际选择的值可以是int或string,具体取决于类型)

如果我是Java,我会创建一个带有两个子节点的对象Type:Numeric和Descriptive。每个都有适当的范围,并以适当的格式存储值。

两者的例子:
名称:气密性 类型:数字
范围:最小1最大5
价值:2

名称:风格
类型:描述性
范围:简约摄影
价值:简约

我不知道在c ++中这样做的最佳方法是什么   我应该看模板吗?因为如果是这样我就无法弄清楚如何使用它们。

2 个答案:

答案 0 :(得分:1)

如果你愿意,你可以做与Java相同的事情。

struct Type {
    std::string Name;
};

struct Numeric : Type {
    int value, min, max;
};

struct Descriptive : Type {
    std::string value, min, max;
};

然而,在决定如何实现特性之前,您必须更好地定义如何使用它以及您想要的界面。例如,上面的内容并不容易使用Type对象作为多态对象。您必须手动检查Type指针是否指向Numeric或Descriptive并采取相应的行动。


获取多态性的一种方法是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;
};

现在,当您在do_something上致电Type *时,它会为动态类型找出正确的方法并调用它。

答案 1 :(得分:0)

您可以在C ++中选择几种方法:

  • 继承。它不仅仅是Java,你可以做到这一点。如果这是你在Java中使用的方法,我不明白为什么你不能在C ++中做同样的事情。
  • 模板。这种方法对应于Java泛型。
  • 联盟。我不认为有一个Java对应,可能值得研究。

如果没有进一步的细节,就不可能给出好的论据,为什么你应该更喜欢一个而不是另一个。