啊是的“朋友”是最可怕的关键词,不是面向对象,不是程序性的。好吧,它再次制造麻烦,我有可能想到的所有可能的警告,并且所有GCC都可以告诉我,读取poly()未在此范围内声明(main.cpp)。任何人都可以帮我弄清楚我做错了什么?我已经尝试重新排列读取poly中的代码,但这没有帮助,没有其他函数原型似乎也改变了这种行为。我知道当我弄清楚它是什么时,我会打自己。
//main.cpp
#include "Polynomial.h"
int main()
{
Polynomial test = readPoly();
}
//Polynomial.h
class Polynomial
{
public :
/** creates the zero Polynomial and sets the default output character*/
Polynomial();
/** creates the constant Polynomial c */
Polynomial( int c );
/** creates a Polynomial with one term c*x^d */
Polynomial(int c, int d);
Polynomial(const Polynomial& toCopy);
friend const Polynomial readPoly();
void insert(Term* term);
}
//Polynomial.cpp
const Polynomial readPoly()
{
cout << "How many terms? ";
int termQty = 0;
cin >> termQty;
int coefficient,degree;
Polynomial newPoly;
for (int n = 0; n <= termQty; n++)
{
cin >> coefficient >> degree;
newPoly.insert(new Term(coefficient,degree));
newPoly.degreeCached = max(degree, newPoly.degreeCached);
}
return newPoly;
}
答案 0 :(得分:3)
友元声明声明一个函数存在于最近的位置
封闭命名空间范围,但它只使声明可见
在课堂上或通过ADL。而且由于功能没有
任何使用Polynomial
的参数,ADL都找不到它。只需添加一个
声明了周围命名空间范围内的函数。或者做
它似乎是一个静态成员,而不是friend
- 在这种情况下
更合适(对我来说,至少)。在那种情况下,你会打电话给它
使用Polynomial::readPoly()
(或只是Polynomial::read()
,因为
范围决议明确说明了我们正在阅读的内容)。这种静态
成员可能是工厂最常见的实施
功能成语。
答案 1 :(得分:1)
在使用之前,您似乎尚未声明readPoly()
。您可以重新排列来源(更多)以使其显示在main()
之上或更好,然后在使用前声明它:
//Polynomial.h
class Polynomial
{
....
};
extern const Polynomial readPoly();
答案 2 :(得分:0)
readPoly确实未在此范围内声明。在标题中添加函数声明。 friend子句只告诉该函数可以访问私有成员,但它不会声明函数本身。所以在主要方面,该函数实际上并未声明。