Zaprzyjaźnienie nie działa

0

Witam, dopiero zaczynam ogarniać klasy, ale czytam, próbuje i niestety nie działa. Program to prosta baza danych, i wywala się na przeciążaniu operatorów. Na metodach niestety też. Proszę o pomoc i wyrozumiałość dla mojej niewiedzy. Oto kod:

class data 
{
      private:
             string fname;
             string lname;
             string phoneNo; 
      public:    
             data(string fname_, string lname_, string phoneNo_) {fname = fname_,lname = lname_, phoneNo = phoneNo_;}; //konstruktor 
             data(); //konstruktor domyślny 
             void wypisz(); //metoda umożliwiająca wypisanie rekordu 
             void wpisz(); //metoda umożliwiająca wpisanie wartości 
             friend ostream & operator<< (ostream &wyjscie, data &b);
             friend ostream & operator>> (ostream &wejscie, data &b);     
};


ostream & operator << (ostream &wyjscie, data &b) // przeciazenie operatora wyjscia
{
    wyjscie<<b.fname<<" "<<b.lname<<" "<<b.phoneNo;
    return wyjscie;
}

istream & operator >> (istream &wejscie, data &b) // przeciazenie operatora wejscia
{
    wejscie>>b.fname>>b.lname>>b.phoneNo;
    return wejscie;
}

void data::wypisz()
{ 
     cout<<data;   
}

void data::wpisz()
{
     cin>>data;
}

Zadeklarowałem tak, jak w poleceniu, nie do końca wiem po co mi ten konstruktor domyślny i czy mam poźniej jeszcze coś pisać, żeby jakoś działał no ale nie w tym rzecz. Przecież piszę, że te operatory są zaprzyjaźnione a nie mogą działać na tych stringach. No i jeszcze metody, w których niby brakuje średnika a tak naprawdę to nie wiem czemu nie działa

0

Sprawdź tak:

class data
{
      private:
             string m_fname;
             string m_lname;
             string m_phoneNo;
      public:    
             data(string fname, string lname, string phoneNo) : m_fname(fname), m_lname(lname), m_phoneNo(phoneNo) {} //konstruktor
             data() {} //konstruktor domyślny
             void wypisz(); //metoda umożliwiająca wypisanie rekordu
             void wpisz(); //metoda umożliwiająca wpisanie wartości
             friend ostream & operator<< (ostream &wyjscie, data &b);
             friend ostream & operator>> (ostream &wejscie, data &b);    
};


ostream & operator << (ostream &wyjscie, data &b) // przeciazenie operatora wyjscia
{
    wyjscie<<b.m_fname<<" "<<b.m_lname<<" "<<b.m_phoneNo;
    return wyjscie;
}

istream & operator >> (istream &wejscie, data &b) // przeciazenie operatora wejscia
{
    wejscie>>b.m_fname>>b.m_lname>>b.m_phoneNo;
    return wejscie;
}

void data::wypisz()
{
     cout<<data;  
}

void data::wpisz()
{
     cin>>data;
}

Jak już masz nadawać 'dziwne' nazwy (takie jak z podkreśleniamy w dziwnych miejscach, czy przedrostkami wynikającymi ze stosowanej konwencji nazweniczej) to stosuj je wewnątrz klas, a nie jako nazwy argumentów, ładniej wtedy to wychodzi w dokumentacji.

0

Niestety wywala identyczny błąd, nic się nie zmieniło. Nie ja wymyślam nazwy tylko takie były w poleceniu więc po prostu się dostosowałem. Jak masz inny pomysł jak to poprawić to zarzuć, w każdym razie dzięki za chęci

0
           friend ostream & operator<< (ostream &wyjscie, data &b);
             friend ostream & operator>> (ostream &wejscie, data &b);    
};


ostream & operator << (ostream &wyjscie, data &b) // przeciazenie operatora wyjscia
{
    wyjscie<<b.fname<<" "<<b.lname<<" "<<b.phoneNo;
    return wyjscie;
}

istream & operator >> (istream &wejscie, data &b) // przeciazenie operatora wejscia
{
    wejscie>>b.fname>>b.lname>>b.phoneNo;
    return wejscie;
}

coś mi tu nie pasi... porównaj deklaracje i definicje.

0
void data::wypisz()
{
     cout<<data;  
}

void data::wpisz()
{
     cin>>data;
}

co to jest data?

0

No kurczę, nie widzę błędu :/ Jak robiłem niemal identyczny program na strukturach to coś takiego działało. Nie wiem w czym recz

1
  1. friend ostream & operator>> (ostream &wejscie, data &b) != istream & operator >> (istream &wejscie, data &b);
  2. data w powyższych metodach nie jest raczej obiektem (nie widzę nic takiego), przekazujesz do strumieni sam typ to tak jakbyś napisał np. "cout << string" albo "cin >> string". Nie wydaje mi się to poprawne chyba, że gdzieś tworzysz obiekt, a ja nie widzę gdzie.
  3. Zdefiniuj te operatory inline, w tedy nie powinno być problemów z dostępem do pól prywatnych.
1
  1. wypadałoby do ostream przekazać jako parametr "const data &b", a nie "data &b" gdyż raczej nie masz zamiaru modyfikować tego obiektu.

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