C++如何解决两个类相互依赖时的不完全型问题

问题描述 投票:0回答:1

我现在正在学习设计模式,我看了《C++刍议》这本书。下面的例子是如何利用handle类来做一些应用。

#include <iostream>
#include <string>
#include <utility>

using namespace std;

class Expr_node;
class Int_node;
class Unary_node;
class Binary_node;

class Expr {
  friend ostream& operator<<(ostream&, const Expr&);

  Expr_node* p;
 public:
  Expr(int);
  Expr(const string&, Expr);
  Expr(const string&, Expr, Expr);
  Expr(const Expr&);
  Expr& operator=(const Expr&);
};

Expr::Expr(int n) {
  p = new Int_node(n);
}

Expr::Expr(const string& op, Expr t) {
  p = new Unary_node(op, t);
}

Expr::Expr(const string & op, Expr left, Expr right) {
  p = new Binary_node(op, left, right);
}

class Expr_node {
    friend ostream& operator<< (ostream&, const Expr_node&);

protected:
    virtual void print(ostream&) const = 0;
    virtual ~Expr_node() { }
};

ostream& operator<< (ostream& o, const Expr_node& e) {
    e.print(o);
    return o;
}

class Int_node: public Expr_node {
  friend class Expr;

  int n;

  explicit Int_node(int k) : n(k) {}
  void print(ostream& o) const override { o << n;}
};

class Unary_node: public Expr_node {
  friend class Expr;
  string op;
  Expr opnd;
  Unary_node(const string& a, const Expr& b): op(a), opnd(b) {}
  void print(ostream& o) const override {o << "(" << op << *opnd << ")";}
};

class Binary_node: public Expr_node {
  friend class Expr;
  string op;
  Expr left;
  Expr right;
  Binary_node(const string& a, const Expr& b, const Expr& c): op(a), left(b), right(c) {}
  void print(ostream& o) const override { o << "(" << left << op << right << ")";}
};

在这个例子中,我想在继承的基础上实现三种不同的操作,从 Expr_node 类。很明显的是 Int_node 在其完整定义之前,并没有很好的定义。我不知道如何解决这个问题。看来这本书中涉及的错误很多。

c++ class handle
1个回答
1
投票

要回答这个问题(除了各种注释中的其他考虑因素)。

你需要实现使用int参数的构造函数的定义。

Expr::Expr(int n) {
  p = new Int_node(n);
}

在构造函数Int_node(int n)的定义之后,在你的例子中,在Int_node类的声明中划线。

class Int_node: public Expr_node {
  friend class Expr;

  int n;

  explicit Int_node(int k) : n(k) {}
  void print(ostream& o) const override { o << n;}
};
© www.soinside.com 2019 - 2024. All rights reserved.