C ++无法通过朋友类访问受保护的成员函数

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

以下示例是我的演示。首先,我创建一个名为Expr_node的抽象类。之后,我创建另一个类Int_node。为了正常访问私有成员和受保护成员函数,我将Expr类设置为Expr_node的朋友类。但是,我仍然无法通过重载print来访问operator<<功能。

#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;}
};
c++ oop protected
1个回答
0
投票

operator<<的问题。它不是类成员,而是朋友功能。在Expr类内实现函数,该类在print上调用p。然后在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;
}
© www.soinside.com 2019 - 2024. All rights reserved.