0

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

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

如果我在 Java 中,我会创建一个有两个孩子的对象类型:Numeric 和 Descriptive。每个都有适当的范围并以适当的格式存储值。

两者的示例:
名称:温暖度
类型:数字
范围:最小 1 最大 5
值:2

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

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

4

2 回答 2

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_somethinga时Type *,它会为动态类型找出正确的方法并调用它。

于 2012-04-18T20:11:01.503 回答
0

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

  • 遗产。不仅仅是 Java 可以做到这一点。如果这是您在 Java 中使用的方法,我不明白为什么您不能在 C++ 中做同样的事情。
  • 模板。这种方法对应于 Java 泛型。
  • 工会。我认为没有对应的Java,可能值得研究。

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

于 2012-04-18T20:04:02.520 回答