朋友功能不访问另一个朋友类的私人成员

时间:2015-08-29 20:27:15

标签: c++ friend friend-function

我有两个类Term和Polynomial。 Polynomial类被声明为Term类的朋友。多项式类有友方功能。当我在Polynomial类的cpp文件中实现该函数时,不会访问Term的私有成员。虽然Polynomial类被声明为它的朋友。我只需要在该函数中访问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.
            }
}

我得到的错误是在&#34; exp&#34;如果在+的重载函数的条件下,它是不可访问的。

4 个答案:

答案 0 :(得分:2)

exp无法在operator+内访问,因为友情不可传递wikipedia):

  

如果A班是B班的朋友,而B班是C班的朋友,   A类不会自动成为C类的朋友。

这也适用于朋友功能。您还必须将friend声明添加到Term或提供访问者功能。

答案 1 :(得分:0)

operator +函数实际上并不是Polynomial类的一部分,因为它是一个友元函数。

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

请参阅“朋友功能”部分。

答案 2 :(得分:0)

您的免费功能 Polynomial operator+(const Polynomial &a, const Polynomial&b)不是Term的成员,因此可以访问私人,也不允许其成为朋友{{} 1}}(只有朋友,而且不是传递性的),因此也无法以这种方式访问​​Polynomial的内部。

要么使其成为Term的成员才能利用现有的朋友关系,或者最好将其设为Polynomial的朋友。
有一个偷偷摸摸的第三种选择,虽然你可能不想要它,这是在Term中内联定义,但保留它是一个自由函数。

答案 3 :(得分:0)

ruby requierer.rb # => /home/__user__/Desktop/requierer.rb 正在尝试访问Polynomial operator+(const Polynomial &a, const Polynomial&b)而非Term类的私人成员。

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