• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z listą jednokierunkową

Object Storage Arubacloud
0 głosów
306 wizyt
pytanie zadane 31 lipca 2015 w C i C++ przez TraY_PL Nowicjusz (120 p.)
edycja 31 lipca 2015 przez TraY_PL

Witam, jestem właśnie w trakcie tworzenia listy jednokierunkowej na klasach. Narazie są tylko metody dodaj do listy i wypisz listę, ale dodam jeszcze resztę wink. Kompilator ma problem z deklaracja wskaźnika pierwszy i nie wiem w czym problem, przy podobnej deklaracji w osoba.h, nic nie wyrzuca. Z góry dzięki za pomoc.

Plik nagłówkowy Osoba.h

#ifndef OsobaH
#define OsobaH

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
class osoba
{
   public:
   string imie;
   string nazwisko;
   int wiek;
   osoba *nastepny;
};

#endif

Plik nagłówkowy Lista.h

#ifndef ListaH
#define ListaH

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class lista
{
   public:
   lista();
   void dodaj_osobe(string imie, string nazwisko, int wiek);
   void usun_osobe(int ktora);
   void wyswietl_liste();
   private:
   osoba *pierwszy;
};

#endif

Plik Lista.cpp

#pragma hdrstop

#include "Lista.h"
#include "Osoba.h"

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

#pragma package(smart_init)

lista::lista()
{
   pierwszy=0;
}
void lista::dodaj_osobe(string imie, string nazwisko, int wiek)
{
   osoba *nowa= new osoba;
   nowa->imie=imie;
   nowa->nazwisko=nazwisko;
   nowa->wiek=wiek;

   if(pierwszy==0)
   {
      pierwszy = nowa;
      pierwszy->nastepny=0;
   }
   else
   {
      osoba *pomoc =pierwszy;

      while(pomoc->nastepny)
      {
         pomoc=pomoc->nastepny;
      }
      pomoc->nastepny=nowy;
      nowy->nastepny=0;
   }

}
void lista::wyswietl_liste();
{
   if(pierwszy==0)
      cout<<"Brak elementow";
   else
   {
      int i =1
      osoba *pomoc= pierwszy;
      while(pomoc->nastepny)
      {
         cout<<i<<". "<<pomoc->imie<<" "<<pomoc->nazwisko<<" "<<pomoc->wiek<<endl;
         pomoc=pomoc->nastepny;
         i++;
      }

}

I tutaj błędy odnośnie wskaźnika w lista.h

[C++ Error] Lista.h(23): E2303 Type name expected
[C++ Error] Lista.h(23): E2139 Declaration missing ;​

2 odpowiedzi

+1 głos
odpowiedź 31 lipca 2015 przez nowyfolder Mądrala (7,250 p.)

Usuń #include "Osoba.h" z pliku Lista.cpp i wrzuc go do pliku Lista.h
Możesz też przed deklaracją klasy Lista dodać następującą linijkę:
class osoba;
Zrób jedno z powyższych, nie obyda naraz.

komentarz 31 lipca 2015 przez TraY_PL Nowicjusz (120 p.)
Zadziałało dołożenie class osoba do Lista.h, później powychodziło już tylko kilka błędów pokroju braku średnika lub złej nazwy wskaznika, ale już ponaprawiane i wszystko działa. Wielkie dzięki.
0 głosów
odpowiedź 31 lipca 2015 przez Szykem2 Nałogowiec (29,510 p.)
Jeśli deklaracje masz w osobnych plikach to kompilator nie wie, że istnieje takie coś jak klasa osoba i nie może utwożyć wskaźnika do obiektu czegoś co nie wiadomo czy istnieje. dodaj w pliku lista.h deklaracje zapowiadającą class osoba; lub #include "osoba.h" i powinno działać
komentarz 31 lipca 2015 przez TraY_PL Nowicjusz (120 p.)
W pliku lista.cpp zawarłem dwa include do "lista.h" i "osoba.h", a gdy próbowałem w lista.h wyrzuca błędy...
[C++ Error] Osoba.h(15): E2238 Multiple declaration for 'osoba'
[C++ Error] Osoba.h(14): E2344 Earlier declaration of 'osoba'
komentarz 31 lipca 2015 przez Szykem2 Nałogowiec (29,510 p.)
dodaj strażnika nagłówka do każdego pliku. Jeśli masz w różnych plikach dodane #include "osoba.h" to kompilator powiedzmy "wkleja" ten sam kod w dwóch óżnych miejscach i tworzą się dwie lub więcej deklaracji klasy Osoba. Strażnik nagłówka wygląda tak:

#pragma once

lub

#ifndef osoba_H

#define osoba_H

kod zpliku osoba.h

#endif
komentarz 31 lipca 2015 przez TraY_PL Nowicjusz (120 p.)

Builder domyślnie mi wstawił strażniki nagłówków, tylko uznałem to za niekonieczne i niewstawiłem do pytania, mój błąd już edytuje post smiley.

komentarz 31 lipca 2015 przez Szykem2 Nałogowiec (29,510 p.)
Teraz to nie wiem czemu #endif kończy się przed klasą. Dalej bedzie wyskakiwał błąd.
komentarz 31 lipca 2015 przez TraY_PL Nowicjusz (120 p.)
Po chwili zrozumiałem gdzie ma być #endif i go dałem na koniec, ale mimo wszystko ciągle są te same błędy.
komentarz 31 lipca 2015 przez Szykem2 Nałogowiec (29,510 p.)
hmmm... dziwne ja po skopiowaniu tego kodu nie miałem błędu multiple definition tylko był problem z dodaj_osobe przy alokacji (nowy zamiast new osoba)

ten sam plik funkcja wyświetl liste po liście argumentów był średnik, przed pętlą while przy deklaracji i brak średnika i brak klamry zamykającej blok funkcji. To wszystkie błędy jakie miałem po skopiowaniu Twojego kodu.

Podobne pytania

0 głosów
1 odpowiedź 460 wizyt
0 głosów
0 odpowiedzi 1,936 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 459 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...