【问题标题】:c++ object type array contains subobjectc++ 对象类型数组包含子对象
【发布时间】:2021-08-15 21:34:19
【问题描述】:

我有使用接口和对象的 Java 代码。但是我不能用 C++ 编写它。你能帮我解决一下吗?

有一个接口名为Operation.java这是代码。

public interface Operation {
    int evaluation(int x, int y); 
}

有一个类实现了名为Multiply.java的Operation类代码如下。

public class Multiply implements Operation {
  public int eval(int x, int y) {
    return = x*y;
  }
}

还有一个类实现了Operation类,名为Summation代码如下。

public class Add implements Operation {

public int eval(int x, int y) {
    return = x+y;
}

最后,它声明了这个数组。

private static final Operation[] OPERATIONS = {new Multiply(), new Summation()};

在这里,我正在尝试用 C++ 编写这段代码。但是我对 C++ 的 OOP 没有深入的了解。我完全理解 Java 代码,但我不能用 C++ 编写。你能帮忙吗?

谢谢。

【问题讨论】:

  • 在 C++ 中,“接口”是一个只有纯抽象函数的类。为了使多态性在 C++ 中工作,您需要使用指向具体对象的指针初始化的 base 类的指针(或引用)。 many decent C++ books 应该教过你的。
  • 关于翻译语言的一般提示:在两种编程语言之间进行翻译(无论它们看起来多么相似)非常类似于在两种口语或书面语言之间进行翻译。您需要精通两种语言才能做好。而且,不要直接翻译,它们几乎永远不会好转。取而代之的是采用新语言的设计并重新实现它,使用该语言的所有功能和优势。
  • 按照已经说过的内容,通常在 C++ 中,您不需要 延迟调度多态性(这基本上是 Java 对大多数问题的钝器解决方案)。虽然您可以在 C++ 中使用它,但在您的情况下,最好只编写一个名为 add 的函数。该函数(指针)是可以传递的一流对象,并且通过适当使用模板,可以在任何需要的地方使用。 OOP 继承并不是您可以使用的唯一工具,而且在 C++ 中,坦率地说,它很少是最好的工具。

标签: java c++ class object implementation


【解决方案1】:

首先你应该知道在 c++ 中我们没有接口关键字或其他东西。但是java中的接口它类似于具有纯虚函数的c++类

class Operation
{
public:
  virtual int eval(int x, int y) = 0; 
}

这很像接口,现在每个继承 Operation 的类都必须实现求值。在 c++ 中,与 java 不同的是,我们有多重继承。

现在您可以编写如下代码:

class Multiply: public Operation {
public:
  int eval(int x, int y) override {
    return x*y;
  }
}

注意:覆盖关键字很重要。

然后你可以写:

Operation* a = new Multiply();

但还要注意,您可以将 OOP 代码转换为 c++ 世界中的简单函数代码。

等等..

【讨论】:

    【解决方案2】:

    鉴于您的最终目标似乎是调用这些东西,我可能建议不要首先制作对象。 C++(以及最新版本的 Java)具有一流的函数,这意味着您可以免费编写函数并将它们视为对象。

    #include <vector>
    #include <functional>
    
    int add(int x, int y) {
      return x + y;
    }
    
    int multiply(int x, int y) {
      return x * y;
    }
    
    int main() {
      std::vector<std::function<int(int, int)>> arr { add, multiply };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多