logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C++ - Jak zamienić struktury na klasy z polami w C++? Przykład zagnieżdżenia

Boshi 29 Kwi 2014 18:39 1329 15
  • #1 13554355
    Boshi
    Poziom 12  
    Posty: 125
    Cześć, mam taki problem; Jak program który jest zapisany na strukturach przerobić na klasy- obiektowo? np mam zagnieżdżone 2 struktury jak to zapisac w klasie jako pole?

    Potrzebuje jakiegoś prostego przykładu bo nie wiem jak się za to zabrać, potem poleci z górki:)

    Np mamy coś takiego: {Jak to zamienic na pola klasy?}
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 13554498
    rufek90
    Poziom 25  
    Posty: 463
    Pomógł: 106
    Ocena: 58
    Struktura to coś w rodzaju klasy klasy, ale z innym poziomem dostępu i bez możliwości pisania w niej metod.

    Zatem u Ciebie można to zapisać jako klasa Uro, która zawiera jakieś tam pola dot. urodzin + zawiera obiekt klasy dane.

    Jeszcze ważna uwaga: w strukturach dane są publiczne, a w klasach domyślnie są private.

    Dawno w c++ nic nie pisałem, ale chyba bardzo nie pokręciłem :)
  • #3 13554796
    Boshi
    Poziom 12  
    Posty: 125
    Tak teorie mniej więcej znam. Bardziej chodzi mi o przykład.

    Z tego co zrozumiałem, to można stworzyć klase uro z polami a potem obiekt dane? czy jak?
  • #5 13557122
    Boshi
    Poziom 12  
    Posty: 125
    Pomyśl trochę. Gdyby na google było jak zamienić zagnieżdżoną strukturę w klasy to bym nie tworzył wątku.
  • #6 13560252
    Boshi
    Poziom 12  
    Posty: 125
    Nikt nie pomoże?

    Coś takiego ?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 13560659
    krru
    Poziom 33  
    Posty: 1819
    Pomógł: 230
    Ocena: 214
    Pamiętaj, że w class masz domyślnie dostęp private - więc musisz zadeklarować jawnie public, albo na początku, albo pola zostawić private i zrobić stosowne metody publiczne. Tablica obiektów przejdzie, jeśli dana klasa ma domyślny (bezparametrowy) konstruktor.
    Po za tym pomieszałeś zależności - to uro ma zawierac tablice osob a nie odwrotnie.
  • #8 13560693
    Boshi
    Poziom 12  
    Posty: 125
    Zaczynam gubić główny temat powoli...
    1 Pomieszałem w jakim sensie ?

    2 Czy sama deklaracja takiego czegoś jest poprawna ?

    3 Dlaczego kompilator krzyczy, że mam używać -> w ww. strukturze jeżeli odnoszę się do np pola rok? przecież -> pozwala odnieść się do wskaźnika a tutaj brak taktowego ?
  • #10 13569297
    Boshi
    Poziom 12  
    Posty: 125
    Dalej tego nie rozkminiam... już chyba wszystkiego próbowałem.. nawet przez tablicę przekazaną jako parametr i wyrzuca błąd;]

    Musi być tablica 10 płyty i 25 utworów, czyli wypełniamy np 2 płyty i 5 utworów.



    {request for member 'wypelnij' in 'Nowa', which is of non-class type 'Plyta [10]'|

    Poprawi to ktoś?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #11 13569515
    the_fifth_horseman
    Poziom 32  
    Posty: 2088
    Pomógł: 76
    Ocena: 16
    Próbujesz wywołać metodę klasy na tablicy obiektów a nie na jej elemencie.
    Funkcje wypelnij i wyswietl zaimplementowałeś jako metody instancji a próbujesz używać ich jakby były metodami statycznymi... ogólnie, kombinowałeś w dobrą stronę, ale z właściwą implementacją gorzej.

    Aktualnie jestem nieco zajęty, za jakąś godzinę - dwie spróbuję ci to poprawić.

    Dodano po 2 [godziny] 1 [minuty]:

    Spróbuj w ten sposób:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Zamiast tablic o statycznym rozmiarze zastosowałem wektory, dzięki temu można dowolnie dodawać i usuwać elementy bez sztywno narzuconego rozmiaru.

    Jeżeli poza klasą potrzebny ci jest dostęp do jej pól, lepiej użyj do tego akcesorów (funkcji pobierających lub ustawiających wartość pól) zamiast deklarować same pola jako publiczne.
  • #12 13570085
    Boshi
    Poziom 12  
    Posty: 125
    Tak twój program chyba działa. Choć szczerze mówiąc, nie mieliśmy klasy Vektor jeszcze, a też mi ciężko ją trochę zrozumieć nie korzystając z niej. Jeżeli mój nie zadziała to twój postaram się zrozumieć. Zresztą musimy mieć statyczne tablice - 10 na płytę i 25 na utwory.

    Jeszcze jak mógłbyś spojrzeć na wersje drugą mojego kodu- Teoretycznie działa wszystko jak powinno. Choć nie wiem czy to tak ma być.


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #13 13570568
    the_fifth_horseman
    Poziom 32  
    Posty: 2088
    Pomógł: 76
    Ocena: 16
    Boshi napisał:
    Tak twój program chyba działa. Choć szczerze mówiąc, nie mieliśmy klasy Vektor jeszcze, a też mi ciężko ją trochę zrozumieć nie korzystając z niej. Jeżeli mój nie zadziała to twój postaram się zrozumieć. Zresztą musimy mieć statyczne tablice - 10 na płytę i 25 na utwory.
    Vector to prościzna. Jeżeli kiedyś otarłeś się na zajęciach o tematykę stosów, kolejek i list powiązanych, to jest pokrewne.
    http://www.cplusplus.com/reference/vector/vector/

    Cytat:
    Jeszcze jak mógłbyś spojrzeć na wersje drugą mojego kodu- Teoretycznie działa wszystko jak powinno. Choć nie wiem czy to tak ma być.
    Minimalnie lepiej, ale nadal błędnie. Jeżeli tworzysz klasę utwory to metody odpowiedzialne za jej wyświetlanie i wypełnianie powinny należeć do niej, a nie być wbudowane w klasę plyta. plyta powinna tylko się do nich odwoływać, tak jak pokazałem.

    Podobnie wyświetlenie zawartości płyty - ilość scieżek jest w twojej wersji jednym z pól tej klasy, więc nie powinna być podawana jako argument.

    Ponieważ liczbę ścieżek użytkownik podaje dopiero wypełniając dane płyty, zakładanie że będzie znana uprzednio też jest błędne.

    Tu masz poprzednie rozwiązanie bez klasy Vector i z twoją klasą kolekcja:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #14 13570696
    Boshi
    Poziom 12  
    Posty: 125
    Dzięki wielkie, przestudiuje to jeszcze ;)

    Ostatnie już pytanie, da radę pod to wsadzić jeszcze średnią cenę płyt?


    koniecznie muszę przestudiować te wskaźniki THIS i ogólnie coś poćwiczyć, bo mimo, że mój kod działa, to tak jak piszesz, jest kiepski :P
  • #15 13570827
    the_fifth_horseman
    Poziom 32  
    Posty: 2088
    Pomógł: 76
    Ocena: 16
    Boshi napisał:
    Ostatnie już pytanie, da radę pod to wsadzić jeszcze średnią cenę płyt?
    Da radę - musisz do klasy Plyta dorobić akcesor który poda ci cenę płyty a do klasy Kolekcja metodę, która będzie z niego korzystać do policzenia średniej. :)
  • #16 13570904
    Boshi
    Poziom 12  
    Posty: 125
    Dzięki wielkie za pomoc :)

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat konwersji zagnieżdżonych struktur w C++ na klasy obiektowe. Użytkownik zadał pytanie dotyczące przekształcenia struktury `dane` oraz struktury `Uro` na odpowiednie klasy. Odpowiedzi wskazywały, że struktury różnią się od klas głównie poziomem dostępu (domyślnie publiczne w strukturach, a prywatne w klasach). Użytkownicy sugerowali stworzenie klasy `Uro`, która zawierałaby pola dotyczące daty urodzin oraz obiekt klasy `dane`. Wskazano również na konieczność jawnego zadeklarowania dostępu publicznego w klasach oraz na poprawne zarządzanie tablicami obiektów. Pojawiły się także pytania dotyczące błędów kompilacji oraz implementacji metod w klasach, co doprowadziło do dyskusji na temat poprawności kodu i jego struktury.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA