与C++中的朋友麻烦
啊是的“朋友”是最令人畏惧的关键字,不太面向对象,不完全是程序性的。那么这里再次出现问题,我可以想到所有可能的警告,并且所有GCC都可以告诉我读取poly()没有在此范围内声明(main.cpp)。任何人都可以帮我弄清楚我做错了什么?我试过在阅读poly中重新排列代码,但这并没有帮助,其他函数原型似乎也没有改变这种行为。我只知道当我弄清楚它是什么时我会打我自己。与C++中的朋友麻烦
//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;
}
朋友声明声明函数在最近的 封闭命名空间范围存在,但它只允许在类中或通过ADL将该声明显示为 。由于该函数没有 任何使用Polynomial
的参数,ADL不会找到它。只需在周围命名空间范围内添加一个 函数声明即可。或者让 它是一个静态成员,而不是friend
—在这种情况下,似乎 更适合(对我来说至少)。在这种情况下,您可以将它称为 和Polynomial::readPoly()
(或者只是Polynomial::read()
,因为 范围分辨率明确表示我们正在阅读的内容)。这种静态成员可能是工厂 函数惯用语的最常用实现。
谢谢你,修正它,是的,可能是更合适的,但它是一个家庭作业,这是规范,所以我不会争辩。 – awiebe 2012-04-03 19:55:50
readPoly确实没有在此范围内声明。在标题中添加一个函数声明。 friend子句只说明这个函数可以访问私有成员,但它并不声明这个函数本身。所以在主要功能是真的没有宣布。
看起来您在使用它之前还没有声明readPoly()
。您可以重新排列源(更多一些),使其出现上述main()
或在使用前最好还是把它声明:
//Polynomial.h
class Polynomial
{
....
};
extern const Polynomial readPoly();
我认为将声明放在标题中更有意义,这样您就不必在需要的地方声明它。 – 2012-04-03 06:44:22
@izomorphius该函数不是“Polymonial”的成员,所以不一定。 – trojanfoe 2012-04-03 06:45:23
@izomorphius:如果功能需要通过transaltion单位进行访问,那么它应该驻留在标题中。 – 2012-04-03 06:48:25
你是否将面向对象与程序对比? – Saintali 2012-04-03 06:40:51
“Term”在哪里申报? – 2012-04-03 06:44:18
我想你应该在'Polynomial'之外的'main'可以知道的地方声明'readPoly()'。 – 2012-04-03 06:45:29