与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; 
} 
+2

你是否将面向对象与程序对比? – Saintali 2012-04-03 06:40:51

+1

“Term”在哪里申报? – 2012-04-03 06:44:18

+0

我想你应该在'Polynomial'之外的'main'可以知道的地方声明'readPoly()'。 – 2012-04-03 06:45:29

朋友声明声明函数在最近的 封闭命名空间范围存在,但它只允许在类中或通过ADL将该声明显示为 。由于该函数没有 任何使用Polynomial的参数,ADL不会找到它。只需在周围命名空间范围内添加一个 函数声明即可。或者让 它是一个静态成员,而不是friend —在这种情况下,似乎 更适合(对我来说至少)。在这种情况下,您可以将它称为 和Polynomial::readPoly()(或者只是Polynomial::read(),因为 范围分辨率明确表示我们正在阅读的内容)。这种静态成员可能是工厂 函数惯用语的最常用实现。

+0

谢谢你,修正它,是的,可能是更合适的,但它是一个家庭作业,这是规范,所以我不会争辩。 – awiebe 2012-04-03 19:55:50

readPoly确实没有在此范围内声明。在标题中添加一个函数声明。 friend子句只说明这个函数可以访问私有成员,但它并不声明这个函数本身。所以在主要功能是真的没有宣布。

看起来您在使用它之前还没有声明readPoly()。您可以重新排列源(更多一些),使其出现上述main()或在使用前最好还是把它声明:

//Polynomial.h 

class Polynomial 
{ 
.... 
}; 

extern const Polynomial readPoly(); 
+1

我认为将声明放在标题中更有意义,这样您就不必在需要的地方声明它。 – 2012-04-03 06:44:22

+0

@izomorphius该函数不是“Polymonial”的成员,所以不一定。 – trojanfoe 2012-04-03 06:45:23

+0

@izomorphius:如果功能需要通过transaltion单位进行访问,那么它应该驻留在标题中。 – 2012-04-03 06:48:25