第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將 OOP java 轉(zhuǎn)換為現(xiàn)代 C++ 代碼、抽象方法和接口方法

將 OOP java 轉(zhuǎn)換為現(xiàn)代 C++ 代碼、抽象方法和接口方法

人到中年有點(diǎn)甜 2023-06-28 15:36:23
我想寫一個(gè)基于Java代碼的c++1z程序首先在Java中聲明一個(gè)接口。public interface MyExpression {  public boolean interpret();}java中實(shí)現(xiàn)接口的抽象類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;  }}最后是班級(jí)public class Or extends NonTerminal {  public boolean interpret() {    return left.interpret() || right.interpret();  }  public String toString() {    return String.format("(%s | %s)", left, right);  }}如何在現(xiàn)代 C++ 中創(chuàng)建此功能?更新 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()。
查看完整描述

2 回答

?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

MyExpression是一個(gè)抽象類,無法實(shí)例化,您需要傳遞指針而不是值。


我建議您使用std::unique_ptr,因?yàn)樗鼤?huì)幫delete您打電話。


你的NonTerminal班級(jí)看起來像這樣。


class NonTerminal  {

protected:

    std::unique_ptr<MyExpression> left, right;


public:

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

        this.left = std::move(left);

    }


    void setRight(std::unique_tr<MyExpression>&& right) {

        this.right = std::move(right);

    }

};

作為旁注,您需要在類聲明中添加NonTerminal您的析構(gòu)函數(shù)是虛擬的,否則您的代碼將調(diào)用未定義的行為。


class MyExpression {

public: 

virtual ~MyExpression() = default;

virtual bool interpret() = 0;

};


查看完整回答
反對(duì) 回復(fù) 2023-06-28
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

Java 和 C++ 之間的值語義差異會(huì)讓您感到困惑。void setRight(MyExpression right)在 Java 中接受對(duì) MyExpression 的引用,而void setRight(MyExpression right)在 C++ 中接受(抽象)類型的值。C++ 中的引用只能像這樣顯式傳遞:void setRight(MyExpression & right)。C++ 中不支持重新綁定引用,并且this.left = left;實(shí)際上執(zhí)行值的復(fù)制賦值。如果您想重新綁定引用,那么您應(yīng)該使用std::reference_wrapperboost::optional引用。C++ 中也沒有垃圾收集來延長對(duì)象的生命周期,直到不再需要它們?yōu)橹?,因此您?yīng)該手動(dòng)管理所有對(duì)象的生命周期,并確保它們存活足夠長的時(shí)間以使引用保持有效。



查看完整回答
反對(duì) 回復(fù) 2023-06-28
  • 2 回答
  • 0 關(guān)注
  • 244 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)