C++如何解决两个class相互依赖时class类型不完整
C++ how to solve class incomplete type when two class depends on each other
我现在正在学习设计模式,我看了《Ruminations on C++》这本书。下面的例子是如何使用句柄class做一些应用。
#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
class 的不同类型的操作。很明显 Int_node
直到它的完整定义才被很好地定义。我不确定如何解决这个问题。看来这本书涉及的错误比较多
回答问题(除了各种评论中的其他注意事项):
你需要实现带int参数的构造函数的定义
Expr::Expr(int n) {
p = new Int_node(n);
}
在构造函数 Int_node(int n) 的定义之后,它在您的示例中内联在 Int_node class 的声明中:
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;}
};
我现在正在学习设计模式,我看了《Ruminations on C++》这本书。下面的例子是如何使用句柄class做一些应用。
#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
class 的不同类型的操作。很明显 Int_node
直到它的完整定义才被很好地定义。我不确定如何解决这个问题。看来这本书涉及的错误比较多
回答问题(除了各种评论中的其他注意事项):
你需要实现带int参数的构造函数的定义
Expr::Expr(int n) {
p = new Int_node(n);
}
在构造函数 Int_node(int n) 的定义之后,它在您的示例中内联在 Int_node class 的声明中:
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;}
};