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;
实际上执行值的复制赋值。如果您想重新绑定引用,那么您应该使用std::reference_wrapper
或boost::optional
引用。C++ 中也没有垃圾收集来延长对象的生命周期,直到不再需要它们为止,因此您应该手动管理所有对象的生命周期,并确保它们存活足够长的时间以使引用保持有效。
添加回答
举报