繁体   English   中英

朋友 std::ostream& operator<< 声明不允许我访问类的私有成员

[英]friend std::ostream& operator<< declaration doesn't let me access the class' private members

我有以下类声明:

#ifndef ANIL_CURSOR_LIST_H
#define ANIL_CURSOR_LIST_H

#include <cstddef>
#include <iostream>

namespace anil {
  class cursor_list_node {
    private:
      int data;
      cursor_list_node* next;
      cursor_list_node* previous;
      friend class cursor_list; 
  };

  class cursor_list {
    private:

      // Data:
      int m_index;
      int m_size;
      cursor_list_node* front;
      cursor_list_node* back;
      cursor_list_node* cursor;

      // Functions:
      void delete_list();

    public:
      cursor_list() : m_index(-1), m_size(0), front(nullptr), back(nullptr),
        cursor(nullptr) {}
      cursor_list(cursor_list& copied_list);
      bool is_empty();
      int size();
      int index();
      int front_data();
      int back_data();
      int cursor_data();
      bool operator==(cursor_list& rhs); // rhs = right hand side
      cursor_list& operator= (cursor_list& rhs);  // rhs = right hand side
      friend std::ostream& operator<<(std::ostream& out, cursor_list& rhs); // rhs = right hand side
      void clear();
      void move_cursor_front();
      void move_cursor_back();
      void move_cursor_prev();
      void move_cursor_next();
      void prepend(int new_data);
      void append(int new_data);
      void insert_before_cursor(int new_data);
      void insert_after_cursor(int new_data);
      void delete_front();
      void delete_back();
      void delete_cursor();
      ~cursor_list();
  };
}

#endif /* ANIL_CURSOR_LIST_H */

在 .cpp 文件中,我有以下 <<operator 的代码:

std::ostream& operator<<(std::ostream& out, anil::cursor_list& rhs) {
  if (rhs.is_empty() != false) {
    anil::cursor_list_node* back_up_cursor = rhs.cursor;
    int back_up_index = rhs.index();
    for (rhs.move_cursor_front(); rhs.index() >= 0; rhs.move_cursor_next()) {
      if (rhs.cursor == rhs.front) {
        out << rhs.cursor_data();
      } else {
        out << ' ' << rhs.cursor_data();
      }
    }
    rhs.m_index = back_up_index;
    rhs.cursor = back_up_cursor;
  }
}

尽管我将 <<operator 声明为类 cursor_list 的朋友,但我无法使用 class_instance.private_member 方法访问私有成员。 有人可以指出我做错了什么吗?

您需要在anil命名空间中定义operator<<

namespace anil {
std::ostream& operator<<(std::ostream& out, cursor_list& rhs) {
    // ...
    return out; // don't forget this
}
}

一个更简单的选择通常是内联定义friend函数:

class cursor_list {
    // ...
    friend std::ostream& operator<<(std::ostream& out, cursor_list& rhs) {
        // ...
        return out;
    }
};

operator<<使用非const右侧参数也很不寻常,我注意到empty()index()等也是非const 也许你有理由这样做,但值得一提。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM