朋友功能无法访问私有数据成员(c ++)

时间:2018-10-23 19:20:12

标签: c++ friend

我搜索了许多不同的问题,但是找不到与我的特定问题匹配的解决方案。我有这个队列的头文件:

#ifndef HEADERFILE
#define HEADERFILE
#include <iostream>
#include <vector>
using namespace std;

template<class myType>
class Queue{
  private:

    int size;
    vector<myType> list; 

  public:

    Queue(int);
    void Enqueue(myType);
    myType Dequeue();
    myType PeekFront();
    int length();
    void empty();
    myType Index(int);
    friend void printArray();

};

#endif

有问题的是friend void printArray。这是实现文件:

#include "queueTask1.h"
#include <vector>
#include <iostream>

using namespace std;

(Other function implementations)

void printArray(){
    for (int i = 0; i < list.size(); i++){
        cout << list.at(i) << ", ";
    }
    cout << endl;
}

尝试运行此错误时指出

  在此范围内未声明

'list'

无论如何在头文件中声明它,其他所有成员函数都可以正常工作。由于某种原因,printArray找不到私有数据成员list,尽管它应该是一个朋友函数。

4 个答案:

答案 0 :(得分:3)

list是非静态数据成员。这意味着每个对象都有一个list。由于它是对象相关的,因此您需要一个对象来访问其list。最简单的方法是将对象传递给类似的函数

// forward declare the function, unless you want to define the function inside the class
template<class ElementType>
friend void printArray(const Queue<ElementType>&);

template<class myType>
class Queue{
    //...
    // declare the friendship
    template<class ElementType>
    friend void printArray(const Queue<ElementType>&);
    //...
};

// define the function
template<class ElementType>
void printArray(const Queue<ElementType>& q)
{
    for (int i = 0; i < q.list.size(); i++){
        cout << q.list.at(i) << ", ";
    }
    cout << endl;
}   

您还需要将Queue的实现转移到头文件中,因为它是一个temaplte。有关更多信息,请参见:Why can templates only be implemented in the header file?

答案 1 :(得分:1)

您需要将类实例传递到IStorage中,然后才能访问该实例的私有成员。否则,printArray()不知道要使用哪个实例。

printArray()

答案 2 :(得分:1)

该声明很好,但是您正在处理该类的哪个实例?如果您拥有list,则object.list可以访问,但是list并没有任何意义。传递您的类的实例,并使用它来访问list

类似的东西:

void printArray(const Queue& object)

答案 3 :(得分:0)

我自己,我会这样做:

template<class myType>
class Queue{
  // snip ...
  public:
  // snip ...
    template<class F>
    friend void foreach_element(Queue& q, F&& f) {
      for(auto&&e:list) f(e);
    }
    template<class F>
    friend void foreach_element(Queue const& q, F&& f) {
      for(auto&&e:list) f(e);
    }
};
template<class myType>
void printArray(Queue<myType> const& q) {
  foreach_element(q, [](auto&& e){ std::cout << e << ","; } );
  std::cout << std::endl;
}

请注意,printArray的实现必须放在标头中,因为它是模板函数。

我暴露了foreach_element以了解元素,然后让printArray是使用它的非朋友。