在C ++中遇到麻烦

时间:2012-04-03 06:38:51

标签: c++ friend

啊是的“朋友”是最可怕的关键词,不是面向对象,不是程序性的。好吧,它再次制造麻烦,我有可能想到的所有可能的警告,并且所有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;
}

3 个答案:

答案 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子句只告诉该函数可以访问私有成员,但它不会声明函数本身。所以在主要方面,该函数实际上并未声明。