C++中的朋友有问题

Trouble with friend in C++

本文关键字:有问题 朋友 C++      更新时间:2023-10-16

啊,yes"friend"是最可怕的关键词,不太面向对象,也不太程序化。好吧,它又惹麻烦了,我有我能想到的所有可能的警告,GCC能告诉我的只是readpoly()没有在这个范围(main.cpp)中声明。有人能帮我找出我做错了什么吗?我尝试过在readpoly中重新排列代码,但这没有帮助,似乎也没有其他函数原型可以改变这种行为。我只知道当我弄清楚它是什么的时候,我会打自己的。

//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(),因为范围决议明确说明了我们正在阅读的内容)。如此静态成员可能是工厂最常见的实现函数成语。

看起来您在使用readPoly()之前没有声明它。您可以重新排列源(更多),使其显示在main()之上,或者更好地在使用前声明它:

//Polynomial.h
class Polynomial
{
 ....
};
extern const Polynomial readPoly();

readPoly确实没有在这个范围内声明。在标头中添加函数声明。friend子句只告诉此函数可以访问私有成员,但它不声明函数本身。因此,总的来说,函数实际上并没有被声明。