Problem z odwołaniem się do pola obiektu

0

Cześć!
mam następujący problem:
podczas takiej deklaracji kompilator wyrzuca mi bład:
(tmp->(nazw_p->next))
tmp to wskaznik do obiekt typu Statek, nazwa_p to wskaźnik do obiekt typu Port, a next to pole obiektu Port będące wskanikiem do obiektu typu Statek... troche to zawiłe, ale mam nadzieje ze ktos mi pokaze prawidłowy sposob odwołania się do tego obiektu. Takie cos potrzebne jest mi do stworzenia listy obiektów typu Statek,
Kod:

 
class Port
{
 Statek *statek;
 Statek *next;
 Przystan przyst;
 string nazwa;
 int rozmiar;//ile statkow moze przyjac
  int liczba_zacumowanych;
 public:
         static int il_portow;
         Port(int rozm,string nazw, string nazw1);
        ~Port();
         void wplywa_statek(Statek *nazw, Port *nazw_p);
         void statek_wyplywa(Statek *nazw);
         void statki_w_porcie();

class Statek
{     string nazwa_s;
      int liczba_pasazerow;
      //Statek *next;
     // Statek(Statek &wzor);
  public:
      static int liczba_statkow;
      Statek(string nazw, int l_pas);
      ~Statek();
      void pokaz_statki();
      void dane_statku();
      void wczytaj (istream& odcz);
      void zapisz(ostream& os);
};

funkcja:

 
void Port::wplywa_statek(Statek *nazw, Port *nazw_p)
{    
     nazw_p->next=NULL;
     cout<<"Do portu "<<nazwa<<" wplywa statek ";
     if(!statek)
                statek=nazw;
     else
     { Statek *tmp = nazw_p->statek;
     while(tmp->(nazw_p->next))
      tmp=tmp->(nazw_p->next);
      (tmp->(nazw_p->next))=statek;
      }
     
     statek->dane_statku(); 
     ++liczba_zacumowanych;
     
}

jesli ktos moze to sprawdzic i powiedziec, jak to zrobic i czy w ogóle to sie kupy trzyma, to by było super
z góry wielkie dzięki!

0

Problem w tym, że opisałeś rzeczy, które spokojnie można wywnioskować z kodu. Nie opisałeś z kolei, co chcesz zrobić. Jak się domyślam, chcesz wrzucić statek na koniec listy statków zacumowanych w porcie. Problem w tym, że Statek ma zakomentowane pole next, a bez niego nie stworzysz listy statków (w normalny sposób). Przy założeniu, że pole next 'samo się zakomentowało', wtedy zamiast (tmp->(nazw_p->next)), daj tmp->next.

Jeśli o coś innego Ci chodzi, to opisz problem konkretniej.

0

Dziękuje ze odpowiedź. Tak, chce wrzucić stworzony obiekt typu Statek na liste statków w porcie. Zmieniłem tak jak mowiłeś, tyle ze program przy drugim wywołaniu funkcji od innego statku wypisuje ten sam statek co poprzednio i sie zacina, sądze ze moze to być związane z tym, ze wskaźnik powinien pokazywacna kolejny statek, a pokazuje na ten sam;] oto kod zmieniony funkcji:

void Port::wplywa_statek(Statek *nazw, Port *nazw_p)
{    
     nazw->next=NULL;
    // statek=nazw;
     cout<<"Do portu "<<nazwa<<" wplywa statek ";
     if(!statek)
                statek=nazw;
     else
     { Statek *tmp = nazw_p->statek;
     while(tmp->next)
      tmp=tmp->next;
      tmp->next=statek;
      }
     
     statek->dane_statku(); 
     ++liczba_zacumowanych;
     
}

a to kod wywoałani jej w funkcji main():

Statek Tit("Titanic",200);
Statek Bat("Batory",100);
Statek Krw("Krwawa_Mery",80);
Statek Mob("Moby_Dick",40); 
int main(int argc, char *argv[])
{ cout<<endl;
  Port Gdynia(3,"Gdynia", "Przystan Pasazerska");
       Gdynia.wypisz();
       Gdynia.wplywa_statek(&Tit, &Gdynia);
       Gdynia.wplywa_statek(&Bat, &Gdynia);//w tym miejscu zamiast na ekranie wypisac ze do portu został zacumowany statek "Batory", znou wyswietla inf o statku "Titanic" i przestaje działać
       Gdynia.wplywa_statek(&Krw, &Gdynia);
       cout<<"PORT ZAPELNIONY!!!- TRZEBA ZBUDOWAC NOWY PORT\n\n";

z góry dzięuje za pomoc!
dorzuce kod konstrukora i destruktora klasy Port, moze to ttkwi jakis bład:

 
Port::Port(int rozm, string nazw, string nazw1):przyst(nazw1)
{               
                statek=NULL;
                nazwa=nazw;
                rozmiar=rozm;
                il_portow++;
                przyst.pokaz();
                cout<<endl;
                cout<<" POWSTAJE NOWY PORT O NAZWIE "<<nazwa<< " I ROZMIARZE: "<<rozmiar<<" STATKOW "<<endl;
               // if (statek!=NULL) statek->pokaz_statki();
               
}

Port::~Port()
{         
            
              cout<<" BURZENIE PORTU: "<<nazwa<<endl;
              il_portow--;
              //if (statek!=NULL) statek->pokaz_statki();
}
0
//w tym miejscu zamiast na ekranie wypisac ze do portu został zacumowany statek "Batory", znou wyswietla inf o statku "Titanic" i przestaje działać

Błędy:

void Port::wplywa_statek(...)
{    
	(...)

	tmp->next = statek; // <--- ZUO!!!
	
	(...)
 
	statek->dane_statku(); //<--- wypisujesz pierwszy statek, zamiast nowo dodany
	
	(...)
}
Gdynia.wplywa_statek(&Tit, &Gdynia);

Po co ten wskaźnik na obiekt Gdynia, jeśli wywołujesz metodę na rzecz tego obiektu?

Po usunięciu zbędnego parametru:

void Port::wplywa_statek(Statek *nazw)
{    
	cout << "Do portu " << nazwa << " wplywa statek ";

	nazw->next = NULL;

	if(!statek) statek = nazw;
	else
	{ 
		Statek *tmp = statek;
		
		while(tmp->next) 
			tmp = tmp->next;
			
		tmp->next = nazw;
	}

	nazw->dane_statku(); 
	++liczba_zacumowanych;
}
0

Dzięki wielkie, program zaczął juz dobrze działać (statki wpływaja tak jak trzeba) , powstał jednka problem przy zapisywaniu stanu całego obiektu w pliku txt.... tzn w ktoryms miejscu zle pokazuje wskaźnik prawdopodobnie, ale nie wiem jak to poprawic....;/: oto kod:

 
void Port::wplywa_statek(Statek *nazw)
{    
     next=NULL;
    // statek=nazw;
     cout<<"Do portu "<<nazwa<<" wplywa statek ";
     if(!(statek))
                statek=nazw;
     else
     { tmp = statek;
     while(next)
      tmp=next;
      next=statek;
     }
     nazw->dane_statku();
     ++liczba_zacumowanych;
}     
void Port::statek_wyplywa(Statek *nazw)
{             statek=nazw;
              cout<<"Z portu "<<nazwa<<" wyplywa statek ";
              statek->dane_statku();
              --liczba_zacumowanych;
}

void Port::statki_w_porcie()
{ 
     cout<<"Ilosc zacumowanych statkow "<<liczba_zacumowanych<<" w porcie "<<nazwa<<"\n";
}
void Port::zapisz(ostream& os)
{ 
     os << nazwa <<" "<< rozmiar<<" " << liczba_zacumowanych <<" " <<"\n";
     cout<<"------------------------------------- \n";
     cout<<"ZAPISUJE DANE CALEGO PORTU: "<<nazwa<<"\n";
     cout<<"-------------------------------------\n";   // ogolnie mowiąc program pokazuje ze zapisuje pierwszy statek na liscie, i sie zawiesza..;/
     for (int z = 0; z < liczba_zacumowanych;z++)
     {   if (statek != NULL)
         {
         statek->zapisz(os);
         
         statek++;
         }
     }
      
       for (int z = 0; z < liczba_zacumowanych;z++)
     {
         --statek;
     } 
     przyst.zapisz(os);
     
     cout<<"---------------------------------------------------\n\n";
}

void Statek::zapisz(ostream& os)
{    
     os << nazwa_s <<" "<< liczba_pasazerow<<"\n";
     cout<<"Zapisuje dane statku "<<nazwa_s<<"\n";
}

void Port::wczytaj(istream& odcz)
{   odcz >> nazwa >> rozmiar  >> liczba_zacumowanych;
         
     cout<<"----------------------------------------------------"<<endl;
     cout<<"WCZYTUJE ZAPISANE DANE  OBIEKTU: "<<nazwa<<" Z PLIKU"<<endl;
     cout<<"----------------------------------------------------"<<endl;    
        
    cout <<"nazwa portu: " << nazwa << "\nrozmiar: " << rozmiar <<"\nliczba zacumowanych statkow :"<<liczba_zacumowanych 
         << endl;
           
     for (int z = 0; z < liczba_zacumowanych;z++)
     {
         if (statek != NULL)
         {
         statek->wczytaj(odcz);
         }
         statek++;
     }
     przyst.wczytaj(odcz);
     for (int z = 0; z < liczba_zacumowanych;z++)
     {
        
         statek--;
         }
    cout<<"---------------------------------------------------\n\n";
}

Drobne zmiany w klasie głownej:

 
class Port
{
 Statek *statek;
 Statek *next; //dodałem 2 wskazniki
 Statek *tmp;//
 Przystan przyst;
 string nazwa;
 int rozmiar;
 int liczba_zacumowanych;
 public:
         static int il_portow;
         Port(int rozm,string nazw, string nazw1);
        ~Port();
         void wplywa_statek(Statek *nazw);
         void statek_wyplywa(Statek *nazw);
         void statki_w_porcie();
         void zapisz(ostream& os);
         void wczytaj(istream& odcz);
         static void wypisz()
        
{
     cout<<" Ilosc portow: "<<il_portow<<endl;
     cout<<endl;
}    

Funkcja main:

ofstream os;
ifstream odcz;
int main(int argc, char *argv[])
{ cout<<endl;
  Port Gdynia(3,"Gdynia", "Przystan Pasazerska");
       Gdynia.wypisz();
       Gdynia.wplywa_statek(&Tit);
       Gdynia.wplywa_statek(&Bat);
       Gdynia.wplywa_statek(&Krw);
       cout<<"PORT ZAPELNIONY!!!- TRZEBA ZBUDOWAC NOWY PORT\n\n";
       Gdynia.statki_w_porcie();
       cout<<endl<<endl;
      Port::wypisz();
      os.open("Port.txt");
      Gdynia.zapisz(os);
      os.close(); 
}
0

Dzięki wielkie, program zaczął juz dobrze działać (statki wpływaja tak jak trzeba)

Jakim cudem? Twoja wersja wplywa_statek poprawna nie jest. Zresztą nie rozumiem, dlaczego nie wykorzystałeś mojej wersji, która wygląda na poprawną.

Po co dodałeś pola **next **i tmp? statek_wyplywa jest błędna. Jeśli dobrze rozumiem idee tej funkcji, najpierw powinieneś znaleźć węzeł ze statkiem, który wypływa, a następnie usunąć go z listy - jak się usuwa węzły z listy jednokierunkowej znajdziesz zapewne na tym forum, poszukaj.

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