朋友功能无法访问另一个朋友的私有成员 class

Friend function is not accessing private members of another friend class

我有两个 classes 项和多项式。多项式 class 被声明为项 class 的友元。多项式 class 中有友元函数。当我在 Polynomial class 的 cpp 文件中实现该函数时,Term 的私有成员在那里无法访问。尽管多项式 class 被声明为它的朋友。我只需要在该函数中访问 Term 的私有成员。有什么帮助吗?这是我的代码:

Polynomial.h 文件:

#pragma once
#include "Term.h"
using namespace std;

// class polynomial;
// friend operator+(const polynomial& , const polynomial&);
class Polynomial
{
private:
    Term *termArray;
    int capacity;
    int terms;

public:
    Polynomial();
    Polynomial(int, int);
    friend Polynomial operator+(const Polynomial& , const Polynomial&);
};

这是我的 Term.h:

#pragma once
using namespace std;
class Polynomial;

class Term
{
friend Polynomial;

private:
    int exp;
    float coef;
};

这是我的 Polynomial.cpp 文件:

#include <iostream>
#include "Polynomial.h"
#include "Term.h"
using namespace std;

Polynomial::Polynomial()
{
    capacity = 1;
    terms = 0;
}

Polynomial::Polynomial(int cap, int noOfTerms)
{
    capacity = cap;
    terms = noOfTerms;
    termArray = new Term[terms];
}

Polynomial operator+(const Polynomial &a, const Polynomial &b)
{
    for(int i = 0; i<a.terms; i++)
        for(int j=0; j < b.terms; j++)
            if(a.termArray[i].exp == b.termArray[j].exp)
            {
                //something to do here.
            }
}

我得到的错误是在 "exp" 的情况下 + 的重载函数无法访问。

operator+ 函数实际上不是多项式 class 的一部分,因为它是一个友元函数。

https://msdn.microsoft.com/en-us/library/465sdshe.aspx

参见 "friend functions" 部分。

expoperator+ 内不可访问,因为友谊 不可传递 (wikipedia):

If class A is a friend of class B, and class B is a friend of class C, class A is not automatically a friend of class C.

这也适用于好友功能。您也必须将 friend 声明添加到 Term 或提供访问器函数。

你的 自由函数 Polynomial operator+(const Polynomial &a, const Polynomial&b) 不是 Term 的成员,所以它可以访问私有函数,也不是它朋友的成员 Polynomial(只有朋友,不能传递),因此也无法通过这种方式访问​​ Term 的内部结构。

要么让它成为 Polynomial 的成员以利用现有的朋友关系,要么最好让它也成为 Term 的朋友。
有一个偷偷摸摸的第三个选项,虽然你可能不想要那个,它在 Polynomial 中内联定义它,但保持它是一个自由函数。

Polynomial operator+(const Polynomial &a, const Polynomial&b) 正在尝试访问 Term 而不是 Polynomial class.

的私有成员

所以 Polynomial operator+(const Polynomial &a, const Polynomial&b) 也必须是 Term 的朋友。