C++ 无法通过朋友访问受保护的成员函数 class
C++ cannot access protected member function by friend class
下面的例子是我的demo。首先,我创建了一个名为 Expr_node
的摘要 class。之后,我创建了另一个 class Int_node
。为了能正常访问private和protected成员函数,我把Expr
class设置为Expr_node
的friendclass。但是,我仍然无法通过重载 operator<<
来访问 print
函数。
#include <iostream>
#include <string>
#include <utility>
using namespace std;
class Expr_node;
class Int_node;
class Expr {
friend ostream& operator<<(ostream&, const Expr&);
Expr_node* p;
public:
Expr(int);
Expr(const string&, const Expr&);
Expr(const string&, const Expr&, const Expr&);
Expr(const Expr& t);
Expr& operator=(const Expr&);
};
class Expr_node {
friend ostream& operator<< (ostream&, const Expr_node&);
friend class Expr;
int use;
protected:
Expr_node(): use(1) {}
virtual ~Expr_node() = default;
virtual void print(ostream&) const = 0;
};
ostream& operator<< (ostream& o, const Expr_node& e) {
e.print(o);
return o;
}
ostream& operator<< (ostream& o, const Expr& e) {
e.p->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;}
};
是operator<<
的问题。它不是 class 成员,而是友元函数。在 Expr class 中实现函数,它在 p
上调用 print
。然后在 Expr 参数上调用它。
像这样:
#include <iostream>
#include <string>
#include <utility>
using namespace std;
class Expr_node;
class Int_node;
class Expr {
friend ostream& operator<<(ostream&, const Expr&);
Expr_node* p;
public:
Expr(int);
Expr(const string&, const Expr&);
Expr(const string&, const Expr&, const Expr&);
Expr(const Expr& t);
Expr& operator=(const Expr&);
void print(ostream& o) const
{
this->p->print(o);
}
};
class Expr_node {
friend ostream& operator<< (ostream&, const Expr_node&);
friend class Expr;
int use;
protected:
Expr_node(): use(1) {}
virtual ~Expr_node() = default;
virtual void print(ostream&) const = 0;
};
ostream& operator<< (ostream& o, const Expr_node& e) {
e.print(o);
return o;
}
ostream& operator<< (ostream& o, const Expr& e) {
e.print(o);
return o;
}
下面的例子是我的demo。首先,我创建了一个名为 Expr_node
的摘要 class。之后,我创建了另一个 class Int_node
。为了能正常访问private和protected成员函数,我把Expr
class设置为Expr_node
的friendclass。但是,我仍然无法通过重载 operator<<
来访问 print
函数。
#include <iostream>
#include <string>
#include <utility>
using namespace std;
class Expr_node;
class Int_node;
class Expr {
friend ostream& operator<<(ostream&, const Expr&);
Expr_node* p;
public:
Expr(int);
Expr(const string&, const Expr&);
Expr(const string&, const Expr&, const Expr&);
Expr(const Expr& t);
Expr& operator=(const Expr&);
};
class Expr_node {
friend ostream& operator<< (ostream&, const Expr_node&);
friend class Expr;
int use;
protected:
Expr_node(): use(1) {}
virtual ~Expr_node() = default;
virtual void print(ostream&) const = 0;
};
ostream& operator<< (ostream& o, const Expr_node& e) {
e.print(o);
return o;
}
ostream& operator<< (ostream& o, const Expr& e) {
e.p->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;}
};
是operator<<
的问题。它不是 class 成员,而是友元函数。在 Expr class 中实现函数,它在 p
上调用 print
。然后在 Expr 参数上调用它。
像这样:
#include <iostream>
#include <string>
#include <utility>
using namespace std;
class Expr_node;
class Int_node;
class Expr {
friend ostream& operator<<(ostream&, const Expr&);
Expr_node* p;
public:
Expr(int);
Expr(const string&, const Expr&);
Expr(const string&, const Expr&, const Expr&);
Expr(const Expr& t);
Expr& operator=(const Expr&);
void print(ostream& o) const
{
this->p->print(o);
}
};
class Expr_node {
friend ostream& operator<< (ostream&, const Expr_node&);
friend class Expr;
int use;
protected:
Expr_node(): use(1) {}
virtual ~Expr_node() = default;
virtual void print(ostream&) const = 0;
};
ostream& operator<< (ostream& o, const Expr_node& e) {
e.print(o);
return o;
}
ostream& operator<< (ostream& o, const Expr& e) {
e.print(o);
return o;
}