C++ 不能通过友元类访问受保护的成员函数

肖恩

下面的例子是我的演示。首先,我创建了一个名为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;}
};
Nabuchodonozor

这是 的问题operator<<它不是类成员,而是友元函数。实施Expr的类内部函数,它调用printp然后在 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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

受保护的成员不能通过指针或对象访问

为什么我不能通过友元函数访问类的私有值?

C ++:无法从派生类访问受保护的成员

C ++-访问基类的受保护/私有成员

访问派生类 C++ 中的受保护成员

C ++继承访问受保护的数据成员

从与C#的类(局部类)后面的代码不同的程序集中的类访问受保护的成员

为什么C ++中的派生类的朋友不能使用受保护的成员?

C ++:为什么不能在派生类中访问受保护的构造方法?

无法在C ++中继承类模板的第二级上访问受保护的类成员

通过 C++ 中附加子类的朋友访问受保护的基类是否合法?

无法从友元函数访问受保护的变量

从另一个类访问受保护的函数c ++

C ++:可以从类及其受保护的成员类型继承吗?

c ++从父类实例化受保护的成员

为什么c++地址中的向量不能通过原始指针访问

受保护成员的默认值C ++

C++ 从友元函数(运算符<<)访问私有数组的元素

如何限制受保护成员只能从第一级子级C#访问

C ++默认移动分配无法访问受保护的基本成员

C ++如何为同一成员创建公共和受保护的访问器

成员'object.equals(object ?, object?'不能通过实例引用进行访问;而是使用名称代替列表清除C#中的字符串来对其进行质量处理?

C ++通过重载更改成员函数的访问权限

为什么我不能从C#的子类访问受保护的方法?

为什么不能通过 using 指令与包含在命名空间中的指令来识别友元函数?

查找类成员 C++ 的保护级别

通过作为另一个类的成员函数的友元函数设置值

VS2015 Update 1错误或C ++错误:为什么朋友类无法访问其朋友的受保护析构函数?

组成类C ++的访问成员