Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ - Konstruktor na wskaźnik tablicy obiektów klasy

06 Lis 2014 12:54 1644 6
  • Poziom 6  
    Witam, mam pewien problem odnośnie tworzenia tablicy obiektów klasy. Przy próbie tworzenia wskaźnika na tablice obiektow wyskakuje mi błąd odnośnie konstruktora domyślnego. Czy mógłby ktoś mi wyjaśnić jak mają wyglądać konstruktory na wskaźnik tablicy obiektów i wskaźnik na tablice wskaźników na przykładzie części poniższego kodu?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Poziom 32  
    Poprzez 'new' tworzysz wskaźnika na tablicę obiektów, tylko samą tablicę. Ponieważ nie ma metody podania parametrów do konstruktorów dla obiektów w tablicy, użyta klasa musi posiadać kontruktor domyślny tj. bezparametrowy. Aktualnie podałeś kontruktor 'oceny(int)' - z parametrem int więc nie da się utworzyć tablicy takich obiektów.
    Poza tym masz jakąs dziwną hierarchię klas - kontruktor klasy oceny nie ma tworzyć obiektów klasy oceny a tylko 'wypełnić treścią' własnie utworzony obiekt, jeden. Najpierw przemyśl jakie klasy potrzebujesz i za co każda klasa ma odpowiadać.
  • Poziom 6  
    Czyli mogę przykładowo zrobić tak, że tworze tablice w funkcji main o typie oceny, a następnie dla każdego elementu tablicy osobno wywoływać przy pomocy jakieś pętli konstruktor (bezparametrowy) i tak wypełnić osobno każdy element tablicy?
  • Poziom 15  
    Jeśli masz konstruktor bezargumentowy, to on będzie wywołany przy tworzeniu tablicy. Nie musisz, a nawet nie powinieneś jawnie go wywoływać.

    Domyślnie kompilator stworzy sam za Ciebie taki konstruktor w klasie, pod warunkiem, że nie zadeklarowałeś konstruktora, który bierze jakieś argumenty. Jeśli tak zrobiłeś, to wtedy musisz jawnie stworzyć konstruktor bezargumentowy, albo napisać "default" po deklaracji:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Jeśli zrobisz tablicę:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    To wtedy zawsze będzie wywołany konstruktor bezargumentowy.
    Jeśli chcesz wywołać jakiś inny, to musisz użyć listy inicjalizacyjnej:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Dodatkowo, jeśli kontruktor, który przyjmuje int jest oznaczony słowem "explicit", to musisz jawnie użyć nazwy oceny przy każdej liczbie:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Ale u Ciebie nie jest, więc nie musisz.
  • Poziom 6  
    Dzięki za powyższe porady. A jakbym chciał stworzyć tablice dynamiczną typu oceny o rozmiarze podanym przez użytkownika podczas kompilacji programu, jest jakiś sposób na to? Przeszukuje neta i ciężko mi cokolwiek znaleźć. Zapomniałem też w poprzednim poście napisać o jaką dokładnie mi tablice chodzi.
  • Poziom 15  
    W C++ możesz użyć klasy std::vector<oceny>, albo std::list<oceny>.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Albo od razu skonstruować wektor o rozmiarze np. 5:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Możesz też użyć zwykłej tablicy alokowanej na stercie, przypisanej do wskaźnika. Jednak w tym wypadku będziesz musiał pamiętać o tym, żeby skasować tę tablicę operatorem delete[] w odpowiednim czasie (a w przypadku std::vector i std::list nie musisz tego robić).
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Poziom 6  
    Dzięki, pomogło. Lecz natchnąłem się znowu na pewien problem. Otóż mam klasę:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Do nie w funkcji main tworzę:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    I za pomocą funkcji chcę zaalokować w niej pamięć:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Mój problem polega z wywoływaniem funkcji takiego wskaźnika na tablice wskaźników, ze zwykłą "->" nie działa zaś gdy robię takie coś (*srednia)-> to program się zwiesza, zaś gdy ciało funkcji umieszczę w funkcji main to wszystko działa jak należy.