Z góry przepraszam bo nie wiedziałem co dokładnie wpisać w temacie.
Mam problem z paroma linijkami kodu niby wszystko działa ale problem w tym ze nie rozumiem paru zapisów. (po prostu wiem ze mam tak zrobić).
adres a1(*wsk);
; Tutaj podczas tworzenia nowego obiektu klasy adres inicjalizuję "konstruktor" wskaźnikiem ? Przecież nigdzie nie mam konstruktora w klasie adres który przyjmuje wskaźnik ?
osoba():im("0"),naz("0"),wiek(0),wsk(new adres){};
Tutaj dlaczego nie mogę sobie zainicjalizować tym samym adresem na który wskaźnik pokazywał ? tylko używam operatora new i przydzielam nowy obszar pamięci?
osoba(const osoba &r):im(r.im),naz(r.naz),wiek(r.wiek),wsk(new adres(*r.wsk)){};
Natomiast tutaj tworze nowy obiekty typu adres i przypisuje wartosc na ktora pokazywal wczesniej wskaznik?
Miałem śmieszna anegdotkę na lekcji ze żona mojego kolegi to nie jest moja zona a jesli chce miec podobna to musze sobie znalezc blizniaczke bo ona jest już zajęta ;p
Teraz troszke inne pytanie : zna ktos z was anegdotkę o przeciazaniu operatora z jakims "tluczkiem do miesa" szukalem w google ? ale nic nie znalazlem .
Podsumowując (pytanie 2 i 3) tak jak to rozumiem to mam nie przypisywać tego samego adresu nowemu wskaznikowi w klasie osoba tylko stworzyć sobie nowy obszar pamięci i następnie dopiero wtedy przypisac nie adres a "wartosc" na ktora pokazywal "stary" wskaznik ? Ale dlaczego tak ?
- To co w kodzie jest w komentarzu to nie wiem czy akurat tam powinno być.. (braklo czasu na lekcji i tylko przepisałem) Wygląda mi to troche na przeciążenie operatora wyjścia ale ciało to bardziej mi przypomina konstruktor kopiujący ? najdziwniejsze mi sie wydaje return *this . Macie jakiś pomysł co do tego ? Na pewno jedna klasa miała właśnie mieć konstruktor kopiujący
#include <iostream>
#include <string>
using namespace std;
class adres
{
string _miasto;
string _kod;
string _ulica;
unsigned int _nr;
public:
adres():_miasto(" brak "),_kod(" brak "),_ulica(" brak "),_nr(0){};
adres(string a,string b,string c,unsigned int d):_miasto(a),_kod(b),_ulica(c),_nr(d){};
friend ostream & operator <<(ostream & out,const adres& r);
};
ostream & operator <<(ostream & out,const adres& r){
out << r._miasto << r._kod << r._ulica << r._nr;
return out;
}
class osoba{
string im,naz;
unsigned wiek;
adres *wsk;
public:
osoba():im("0"),naz("0"),wiek(0),wsk(new adres){};
osoba(const string& imie,const string& nazwisko,const unsigned &lata,const adres &a):im(imie),naz(nazwisko),wiek(lata),wsk(new adres){};
osoba(const osoba &r):im(r.im),naz(r.naz),wiek(r.wiek),wsk(new adres(*r.wsk)){};
// osoba & operator <<(ostream & out,const osoba& r){
//if(this!=&r){
// im=r.im;
// maz=r.naz;
// wiek=r.wiek;
// *wsk= *r.wiek // SKOPIUJ WARTOSC NIE ADRES!
//}
//return *this;
//};
};
int main()
{
adres* wsk = new adres("Czestochowa", " 42-200", " Dabrowskiego ", 73);
cout << *wsk << '\n'; // o co z tym chodzilo ?
adres a1(*wsk);
delete wsk;
const adres* wsk1 = new adres("Warszawa", "00-950","Mysliwiecka", 357);
cout << a1 << '\n';
cout << *wsk1 << '\n';
adres a2;
cout << a2 << '\n';
a2 = a1;
cout << a2 << '\n';
osoba o("Jan", "Kos", 25, *wsk1);
delete wsk1;
/*cout << o << '\n';
osoba o1(o);
cout << o1 << '\n';
osoba o2;
cout << o2 << '\n';
o2 = o1;
cout << o2 << '\n';*/
return 0;
}
Nie będę zamykać tematu póki co bo mam zamiar zrobić całe zadanie a zapewne będę musiał się was jeszcze o coś zapytać ;d