【问题标题】:C++ cannot access protected member function by friend classC ++无法通过朋友类访问受保护的成员函数
【发布时间】:2020-08-13 03:05:39
【问题描述】:

以下示例是我的演示。首先,我创建了一个名为Expr_node 的抽象类。之后我创建了另一个类Int_node。为了正常访问private和protected成员函数,我将Expr类设置为Expr_node的朋友类。但是,我仍然无法通过重载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;}
};

【问题讨论】:

    标签: c++ oop protected


    【解决方案1】:

    operator&lt;&lt;的问题。它不是类成员,而是朋友功能。在 Expr 类中实现函数,该函数在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2021-01-09
      • 1970-01-01
      • 2013-11-30
      • 2021-08-16
      相关资源
      最近更新 更多