Problem z funkcją zaprzyjaźnioną

0

Mam taki kod:
plik k.h

#ifndef K_H
#define K_H
class k1
{
friend double x(k1 & k);
friend double y();
};
#endif // K1_H

plik k.cpp

#include "k1.h"
double x(k1 & k)
{
    return -1.0;
}
double y()
{
    return -1.0;
}

plik main.cpp

#include "k1.h"
int main()
{
    k1 s;
    return x(s) * y();
}

z tych trzech plików robię projekt w code::blocks
przy próbie kompilacji otrzymuję następujący błąd:

In function ‘int main()’:
main.cpp|5|error: ‘y’ was not declared in this scope

Czy ktoś może mi wyjaśnić, dlaczego funkcja y() jest uznawana za niezadeklarowaną?

0

Brak deklaracji.

0
Dr Zielu napisał(a)

Brak deklaracji.

to akurat zrozumiałem, ale dlaczego kompilator twierdzi, że nie ma deklaracji funkcji y()?
Wydaje mi się, że w pliku "k.h" ta funkcja została zadeklarowana.

poprawka - moje pliki wyglądają następująco:
plik k.h

#ifndef K_H
#define K_H
class k
{
friend double x(k & s);
friend double y();
};
#endif // K_H

plik k.cpp

#include "k.h"
double x(k & s)
{
    return -1.0;
}
double y()
{
    return -1.0;
}

plik main.cpp

#include "k.h"
int main()
{
    k s;
    return x(s) * y();
}
0

Brak deklaracji w pliku main.

0

Poza tym jak masz plik nagłówkowy, w którym masz klasę i plik cpp, to musisz powiedzieć, że to definicja metody z klasy K

double K::x(k & s)
{
    return -1.0;
}
double K::y()
{
    return -1.0;
}

Zielu przetłumaczyć te 3 słówka to nie problem.

0

Widać jest.

0

<quate=ShalomA> gdzie main.cpp widzi deklarację funkcji y? Podpowiem że nie widzi jej w k.h...</quote>
Wydaje mi się, że skoro widoczna jest deklaracja funkcji x(), to i funkcja y() powinna być widoczna.

0
laik napisał(a)

Wydaje mi się, że skoro widoczna jest deklaracja funkcji x(), to i funkcja y() powinna być widoczna.

A skąd wiesz, który z operandów wziął najpierw kompilator? x * y = y * x przecież, więc równie dobrze mógł wziąć się najpierw za y stwierdził błąd i dalej nie sprawdzał. Kompilatory tak czasem robią, chociaż nie wiem jak jest z Twoim bo w nim nie pisałem.

0

Nie mógł tak zrobić, nie znając typów zwracanych obydwu funkcji. Dodaj do k.h deklaracje obydwu funkcji:

double x(k&);
double y();

Ciekawe natomiast to, że nie trzeba wcześniej deklarować funkcji, jeśli jest zadeklarowana w klasie jako friend i przyjmuje obiekt/referencję/wskaźnik tego typu (x(k&)).

0
iooi napisał(a)

... nie trzeba wcześniej deklarować funkcji, jeśli jest zadeklarowana w klasie jako friend i przyjmuje obiekt/referencję/wskaźnik tego typu (x(k&)).

A czy ktoś może mi wyjaśnić dlaczego?

1 użytkowników online, w tym zalogowanych: 0, gości: 1