zoukankan      html  css  js  c++  java
  • C++ 当友元是类模板时

    C++ 当友元是类模板时

    现在有这样一个类模板

    //QueueItem.hpp
    template <class T>
    class QueueItem
    {
    private:
        QueueItem(const T &t) : item(t), next(0) {}
        T item;          // value stored in this element
        QueueItem *next; // pointer to next element in the Queue
    };
    

    存在另一个类模板,需要访问上面的类模板的私有域

    //Queue.hpp
    template <class T>
    class Queue
    {
      public:
        Queue() : head(0), tail(0) {} //名字 Queue 是 Queue<Type> 缩写表示
        Queue(const Queue &q) : head(0), tail(0) { copy_elems(q); }
        Queue &operator=(const Queue &); // copy control to manage pointers to QueueItems in the Queue
        virtual ~Queue() { destroy(); }
        Type &front() { return head->item; } // return element from head of Queue
        const Type &front() const { return head->item; }
        void push(const Type &); // add element to back of Queue
        void pop();              // remove element from head of Queue
        bool empty() const
        { // true if no elements in the Queue
            return head == 0;
        }
    
      private:
        QueueItem<Type> *head;          // pointer to first element
        QueueItem<Type> *tail;          // pointer to last element
        void destroy();                 // delete all the elements
        void copy_elems(const Queue &); // copy elements from parameter
    }
    

    要访问QueueItem类私有域就必须声明Queue类为友元
    但两个类不在同一文件中

    所以必须先声明Queue类模板;

    //QueueItem.hpp
    template <class T> class Queue;
    

    同时也必须声明Queue类为友元

    template <class T>
    class QueueItem
    {
        friend class Queue<T>;
        //...同上
    };
    

    这里Queue的T与QueueItem的T为相同类型
    注意声明类模板和声明友元的不同,我开始就被这个给坑了

  • 相关阅读:
    练习JSON
    实现JSON+JDBC的简单操作(以显示对象为例)
    三层架构:表示层-业务逻辑层-数据访问层
    实现json的三个操作(训练JSON)
    实现邮箱验证 简化版
    复习注册表单html和jQuery
    监听器(测试在线人数的)第一种 HttpSessionBindingListener
    Django的中间件
    Django form表单
    Django
  • 原文地址:https://www.cnblogs.com/kwebi/p/9788552.html
Copyright © 2011-2022 走看看