朋友功能无法访问另一个朋友的私有成员 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" 部分。
exp
在 operator+
内不可访问,因为友谊 不可传递 (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
的朋友。
我有两个 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" 部分。
exp
在 operator+
内不可访问,因为友谊 不可传递 (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
的朋友。