C++ 当友元是类模板时

本文详细介绍了在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为相同类型
注意声明类模板和声明友元的不同,我开始就被这个给坑了

转载于:https://www.cnblogs.com/kwebi/p/9788552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值