【问题标题】:Friend function is not accessing private members of another friend class朋友功能没有访问另一个朋友类的私有成员
【发布时间】:2015-11-24 06:06:53
【问题描述】:

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

多项式.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”。

【问题讨论】:

  • 您的Term 类只能由Polynomial 使用。它也可能是一个嵌套类。

标签: c++ friend friend-function


【解决方案1】:

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

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

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

【讨论】:

  • 好的,我也在cppreference 上找到了它,这是笔记中的第一件事。我以为它会更正式,但没有。
【解决方案2】:

Polynomial operator+(const Polynomial &amp;a, const Polynomial&amp;b) 正在尝试访问 Term 而不是 Polynomial 类的私有成员。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      您的免费功能 Polynomial operator+(const Polynomial &amp;a, const Polynomial&amp;b) 不是Term 的成员,因此它不会被允许访问私人信息,也不是它的朋友Polynomial 的成员(只是一个朋友,那就是不可传递),因此也无法以这种方式访问​​Term 的内部结构。

      要么让它成为Polynomial 的成员以利用现有的朋友关系,要么最好让它成为Term 的朋友。
      还有一个狡猾的第三个选项,虽然你可能不希望这样,它在Polynomial 中内联定义它,但保持它是一个免费函数。

      【讨论】:

        猜你喜欢
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 2021-11-01
        • 2011-04-17
        相关资源
        最近更新 更多