2 回答

TA貢獻1796條經驗 獲得超10個贊
MyExpression是一個抽象類,無法實例化,您需要傳遞指針而不是值。
我建議您使用std::unique_ptr,因為它會幫delete您打電話。
你的NonTerminal班級看起來像這樣。
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您的析構函數是虛擬的,否則您的代碼將調用未定義的行為。
class MyExpression {
public:
virtual ~MyExpression() = default;
virtual bool interpret() = 0;
};

TA貢獻1850條經驗 獲得超11個贊
Java 和 C++ 之間的值語義差異會讓您感到困惑。void setRight(MyExpression right)
在 Java 中接受對 MyExpression 的引用,而void setRight(MyExpression right)
在 C++ 中接受(抽象)類型的值。C++ 中的引用只能像這樣顯式傳遞:void setRight(MyExpression & right)
。C++ 中不支持重新綁定引用,并且this.left = left;
實際上執(zhí)行值的復制賦值。如果您想重新綁定引用,那么您應該使用std::reference_wrapper
或boost::optional
引用。C++ 中也沒有垃圾收集來延長對象的生命周期,直到不再需要它們?yōu)橹?,因此您應該手動管理所有對象的生命周期,并確保它們存活足夠長的時間以使引用保持有效。
添加回答
舉報