Проблема с другом в C ++ - PullRequest
       5

Проблема с другом в C ++

2 голосов
/ 03 апреля 2012

Ах да, «друг» - самое страшное из ключевых слов, не совсем объектно-ориентированное, не совсем процедурное.Что ж, здесь снова возникают проблемы, у меня есть все возможные предупреждения, о которых я могу подумать, и все, что GCC может сказать мне, это то, что read poly () не объявлена ​​в этой области (main.cpp).Может кто-нибудь помочь мне понять, что я делаю не так?Я попытался переставить код в read 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 ]

3 голосов
/ 03 апреля 2012

Объявление друга объявляет, что функция существует в ближайшем охватывающий область имен, но только делает объявление видимым в классе или через ADL. И так как функция не имеет любые аргументы, которые используют Polynomial, ADL не найдет его. Просто добавьте объявление функции в окружающей области имен. Или сделать это статический член, а не friend - в этом случае кажется более подходящим (для меня, по крайней мере). В этом случае вы бы назвали это с Polynomial::readPoly() (или просто Polynomial::read(), так как Разрешение области четко говорит, что мы читаем). Такой статичный участники, вероятно, самая обычная реализация фабрики идиома функции.

1 голос
/ 03 апреля 2012

Похоже, вы не объявили readPoly() перед его использованием. Вы можете изменить расположение источника (еще немного) так, чтобы он отображался выше main() или, что еще лучше, объявите его перед использованием:

//Polynomial.h

class Polynomial
{
 ....
};

extern const Polynomial readPoly();
0 голосов
/ 03 апреля 2012

readPoly действительно не объявлено в этой области. Добавьте объявление функции в заголовок. Предложение друга только говорит, что эта функция может получить доступ к закрытым членам, но не объявляет саму функцию. Так что в основном функция действительно не объявлена.

...