Witam, uczę się z Symfonii C++ i jestem na rozdziale dotyczącym konwersji między klasami i napotkałem pewien problem. Oto przykład z książki:
#include <iostream>
#include <string>
using namespace std;
class numer;
class zespol
{
private:
float rzeczyw;
float urojon;
public:
zespol(float r = 0, float u = 0) : rzeczyw(r), urojon(u){}
zespol(numer);
};
class numer
{
float n;
char opis[80];
friend zespol::zespol(numer);
public:
numer(int k, char *t = "bez opisu") : n(k)
{
strcpy(opis,t);
}
};
zespol::zespol(numer ob)
{
rzeczyw = 0b.n;
urojon = 0;
}
zespol dodaj(zespol a, zespol b)
{
zespol suma(0, 0);
suma.rzeczyw = a.rzeczyw + b.rzeczyw;
suma.urojon = a.urojon + b.urojon;
return suma;
}
int main(void)
{
cin.get();
cin.get();
return 0;
}
Kompilator podświetla mi następujące fragmenty kodu:
class numer
{
float n;
char opis[80];
friend zespol::zespol(numer);
public:
numer(int k, char *t = "bez opisu") : n(k)
{
strcpy(opis,t);
}
};
W linijce
friend zespol::zespol(numer)
podkreśla zespol(numer);
i po najechaniu na zespol pisze:
no instance for overloaded function zespol::zespol matches the specified type. a po najechaniu na numer: copy constructor for class "numer" may not have parameter of type numer.
Czemu konstruktor nie może mieć parametru tego typu? Przecież tak jest pokazane w książce.
```cpp
zespol::zespol(numer ob)
{
rzeczyw = ob.n;
urojon = 0;
}
W tym fragmencie podkreśla n i pisze, że: member numer::n is inaccessible
O ile tutaj rozumiem czemu jest niedostępny, ponieważ jest zadeklarowany jako prywatny i po zmianie na public nie podkreśla już. Ale przecież w linijce
friend zespol::zespol(numer);
klasa numer pozwala aby konstruktor klasy zespol miał dostęp do jej składników prywatnych. Czyżby autor się pomylił?
Autor też dodaje, że funkcja odpowiedzialna za dodawanie liczb zespolonych jest identyczna jak w poprzednich przykładach, czyli:
zespol dodaj(zespol a, zespol b)
{
zespol suma(0, 0);
suma.rzeczyw = a.rzeczyw + b.rzeczyw;
suma.urojon = a.urojon + b.urojon;
return suma;
}
Lecz i tutaj podkreśla mi fragmenty z rzeczyw i urojon i występuje podobnym problem z dostępem jak wyżej i pomaga dodanie public przed tym fragmentem:
class zespol
{
float rzeczyw;
float urojon;
Kolejna pomyłka autora? Te dwa ostatnie problemy nie są tak uciążliwe gdyż wiem jak je rozwiązać bardziej zależy mi na tym pierwszym dotyczącym konwersji klas. Czemu to nie działa?