【问题标题】:friend std::ostream& operator<< declaration doesn't let me access the class' private members朋友 std::ostream& operator<< 声明不允许我访问类的私有成员
【发布时间】:2021-07-09 12:42:10
【问题描述】:

我有以下类声明:

#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 文件中,我有以下代码用于

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;
  }
}

虽然我将

【问题讨论】:

    标签: c++ namespaces operator-overloading


    【解决方案1】:

    您需要在anil 命名空间中定义operator&lt;&lt;

    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&lt;&lt; 的右侧参数不是const 也是很不寻常的,我注意到empty()index() 等也不是const。也许你有这样做的理由,但值得一提。

    【讨论】:

    • 非常感谢您的帮助!我基本上是将此类的 C 实现转换为 C++。因此,我决定先让代码工作,然后再完全转换为正确的 C++ 风格。
    • @AnilCelikMaral 很高兴它有帮助,不客气!这听起来很有价值!
    猜你喜欢
    • 2020-09-06
    • 2021-12-30
    • 2013-04-09
    • 2015-08-03
    • 2021-08-16
    • 2018-07-22
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多