C ++ не может получить доступ к защищенной функции-члену из класса друга - PullRequest
0 голосов
/ 29 апреля 2020

Следующий пример - моя демонстрация. Сначала я создаю абстрактный класс с именем 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;}
};

1 Ответ

0 голосов
/ 29 апреля 2020

Это проблема 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...