猿问

将 OOP java 转换为现代 C++ 代码、抽象方法和接口方法

我想写一个基于Java代码的c++1z程序


首先在Java中声明一个接口。


public interface MyExpression {

  public boolean interpret();

}

java中实现接口的抽象类


public abstract class NonTerminal implements MyExpression {

  protected MyExpression left, right;

  public void setLeft(MyExpression left) {

    this.left = left;

  }

  public void setRight(MyExpression right) {

    this.right = right;

  }

}

最后是班级


public class Or extends NonTerminal {

  public boolean interpret() {

    return left.interpret() || right.interpret();

  }

  public String toString() {

    return String.format("(%s | %s)", left, right);

  }

}

如何在现代 C++ 中创建此功能?


更新 C++ 代码片段


#include <iostream>

#include <memory>

#include <ostream>


class BooleanExpression {

public:

    virtual ~BooleanExpression() = default;

    virtual bool interpret() = 0;

};


class NonTerminal : public BooleanExpression {

protected:

    std::unique_ptr<BooleanExpression> left, right;


public:

    void setLeft(std::unique_ptr<BooleanExpression>&& left) {

        this->left = std::move(left);

    }


    void setRight(std::unique_ptr<BooleanExpression>&& right) {

        this->right = std::move(right);

    }

};


class Terminal : public BooleanExpression {

protected:

    bool value;


public:

    Terminal(bool value) : value(value) {}


    //tostring

};


class False : public Terminal {


public:

    False() : Terminal(false) {}


    //tostring

};


class True : public Terminal {


public:

    True() : Terminal(true) {}


    //tostring

};


class Or : public NonTerminal {

public:

    bool interpret() {

        return left->interpret() || right->interpret();

    }

};


class And : public NonTerminal {

public:

    bool interpret() {

        return left->interpret() && right->interpret();

    }


    //tostring

};


int main() {


    using namespace std;

    auto  t1 = make_unique<True>();

    auto f1 = make_unique<False>();


    auto or1 = make_unique<Or>();

    or1->setLeft(t1);



    return 0;

}

这段代码无法编译。or1->setLeft不接受t1,即make_unique()。


人到中年有点甜
浏览 159回答 2
2回答

白衣染霜花

MyExpression是一个抽象类,无法实例化,您需要传递指针而不是值。我建议您使用std::unique_ptr,因为它会帮delete您打电话。你的NonTerminal班级看起来像这样。class NonTerminal&nbsp; {protected:&nbsp; &nbsp; std::unique_ptr<MyExpression> left, right;public:&nbsp; &nbsp; void setLeft(std::unique_ptr<MyExpression>&& left) {&nbsp; &nbsp; &nbsp; &nbsp; this.left = std::move(left);&nbsp; &nbsp; }&nbsp; &nbsp; void setRight(std::unique_tr<MyExpression>&& right) {&nbsp; &nbsp; &nbsp; &nbsp; this.right = std::move(right);&nbsp; &nbsp; }};作为旁注,您需要在类声明中添加NonTerminal您的析构函数是虚拟的,否则您的代码将调用未定义的行为。class MyExpression {public:&nbsp;virtual ~MyExpression() = default;virtual bool interpret() = 0;};

慕盖茨4494581

Java 和 C++ 之间的值语义差异会让您感到困惑。void setRight(MyExpression right)在 Java 中接受对 MyExpression 的引用,而void setRight(MyExpression right)在 C++ 中接受(抽象)类型的值。C++ 中的引用只能像这样显式传递:void setRight(MyExpression & right)。C++ 中不支持重新绑定引用,并且this.left = left;实际上执行值的复制赋值。如果您想重新绑定引用,那么您应该使用std::reference_wrapper或boost::optional引用。C++ 中也没有垃圾收集来延长对象的生命周期,直到不再需要它们为止,因此您应该手动管理所有对象的生命周期,并确保它们存活足够长的时间以使引用保持有效。
随时随地看视频慕课网APP

相关分类

Java
我要回答