【发布时间】:2020-04-22 01:27:30
【问题描述】:
我有这个基类
struct Expr
{
virtual void accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor) = 0;
explicit Expr() = default;
virtual ~Expr() = default;
};
还有一些子类,例如:
struct Binary : Expr
{
explicit Binary(Expr &left, Token &_operator, Expr &right);
Expr left;
Token _operator;
Expr right;
void accept(Expr &expr, ExprVisitor &visitor) override;
};
struct Grouping : Expr
{
explicit Grouping(Expr &expression);
Expr expression;
void accept(Expr &expr, ExprVisitor &visitor) override;
};
现在由于 Expr 有一个纯虚函数,所以不可能有一个 Expr 对象,但我希望作为二进制和分组构造函数的参数,让它们采用其他二进制/分组/子类表达式。我该怎么做?
有没有办法将“X 的任何子类”作为参数传递,我实际上从不希望 X 成为可传递的参数(实际上不可能这样做,因为它是一个抽象类)
我一直在考虑使用智能指针,谁能举个例子?
编辑
所以我尝试实现智能指针,但我无法让我的其他类与智能指针交互:
// expr_impl.hpp
struct Binary : Expr
{
explicit Binary(std::shared_ptr<const Expr> &left, Token &_operator, std::shared_ptr<const Expr> &right);
std::shared_ptr<const Expr> left;
Token _operator;
std::shared_ptr<const Expr> right;
void accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor) override;
};
struct Grouping : Expr
{
explicit Grouping(std::shared_ptr<const Expr> &expression);
std::shared_ptr<const Expr> expression;
void accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor) override;
};
struct LiteralExpr : Expr
{
explicit LiteralExpr(Literal &literal);
const Literal literal;
void accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor);
};
// expr_impl.cpp
Binary::Binary(std::shared_ptr<const Expr> &left, Token &_operator, std::shared_ptr<const Expr> &right) : left(left), _operator(_operator), right(right) {}
void Binary::accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor)
{
visitor.visit(*this);
}
Grouping::Grouping(std::shared_ptr<const Expr> &expression) : expression(expression) {}
void Grouping::accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor)
{
visitor.visit(*this);
}
LiteralExpr::LiteralExpr(Literal &literal) : literal(literal) {}
void LiteralExpr::accept(std::shared_ptr<const Expr> &expr, ExprVisitor &visitor)
{
visitor.visit(*this);
}
// exprvisitor.hpp
struct ExprVisitor
{
virtual void visit(Binary &expr) = 0;
virtual void visit(Grouping &expr) = 0;
virtual void visit(LiteralExpr &expr) = 0;
virtual void visit(Unary &expr) = 0;
explicit ExprVisitor() = default;
virtual ~ExprVisitor() = default;
};
// astprinter.hpp
struct AstPrinter : ExprVisitor
{
void visit(Binary &expr) override;
void visit(Grouping &expr) override;
void visit(LiteralExpr &expr) override;
void visit(Unary &expr) override;
std::string result;
std::string getResult();
};
// astprinter.cpp
void AstPrinter::visit(Binary &expr)
{
result += "(";
result += expr._operator.lexeme;
expr.accept(expr.left, *this);
// expr.accept(expr.right, *this);
result += ")";
}
void AstPrinter::visit(Grouping &expr)
{
}
void AstPrinter::visit(LiteralExpr &expr)
{
}
【问题讨论】:
标签: c++ pointers inheritance