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

Tablica obiektów klasy z konstruktorem

0 głosów
1,453 wizyt
pytanie zadane 29 listopada 2015 w C i C++ przez diablol Nałogowiec (26,480 p.)
przywrócone 29 listopada 2015 przez diablol
Witam, Mam klase Miecz a w niej konstruktor z argumentami(string, int, int, int). Czy można stworzyć tablice obiektów klasy Miecz i odrazu zainicjalizować to tablice? Jak można to jak?

3 odpowiedzi

+1 głos
odpowiedź 29 listopada 2015 przez adrian17 Mędrzec (167,340 p.)
wybrane 29 listopada 2015 przez diablol
 
Najlepsza

Nie za bardzo. Można jako tako przy definicji:

Miecz miecze[3] = { Miecz("a", 1), Miecz("b", 2), Miecz("c", 3) };

Ale to nie jest zbyt wygodne ani rozszerzalne.

Poprawna odpowiedź, jak zwykle w C++ie, brzmi: użyj std::vector.

    std::vector<Miecz> miecze = { Miecz("a", 1), Miecz("b", 2), Miecz("c", 3) };
    // albo dodawanie na biezaco
    miecze.emplace_back("d", 4);

 

komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)

Napisałem tak:

std::vector<Miecz> przedm_sklep;
    przedm_sklep.emplace_back("d", 4, 2, 3);

i mam błąd

std::vector<Miecz>’ has no member named ‘emplace_back’|

Co mam źle?
 

 

komentarz 29 listopada 2015 przez adrian17 Mędrzec (167,340 p.)

Włącz c++11 w opcjach IDE albo dodaj flagę -std=c++11 w kompilatorze.

Albo użyj starszą wersję:

przedm_sklep.push_back(Miecz("d", 4, 2, 3));

 

komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)
Dziękuje właśnie o to mi chodziło.
komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)

Ale jak teraz odwołać się do argumentów int?

vector[i].string; ///Tak mi działa
 vector[i].int; /// Ale Tak mi nie działa

 

komentarz 29 listopada 2015 przez Patrycjerz Mędrzec (181,510 p.)

Musisz po kropce podać nazwę pola obiektu. Jeśli nazwałeś je int, to nie dziw się, że nie działa (nie wolno używać słów kluczowych jako nazw zmiennych/stałych).

komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)
Ale ja nie dałem nazwy int czy string tylko napisałem żebyś zrozumiał jakiego typu używam.
komentarz 29 listopada 2015 przez Patrycjerz Mędrzec (181,510 p.)

Nie rozumiem... masz kontener (czy tam wektor), np. o nazwie kontener:

std::vector<MojaKlasa> kontener;

Potem zapełniasz go obiektami:

kontener.push_back(MojaKlasa());
//...

A na końcu korzystasz z pola danego obiektu:

kontener[0].pole_obiektu = 4; // Tutaj publiczna zmienna int.

 

komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)

Dobra wszystko działa pomyliłem nazwe składniku z nazwo konstruktora indecision. Ale dzięki za fatyge

0 głosów
odpowiedź 29 listopada 2015 przez Patrycjerz Mędrzec (181,510 p.)

Oczywiście, że tak. Przy tablicy statycznej:

Klasa tablica[3];
tablica[0] = Klasa();
tablica[1] = Klasa();
tablica[2] = Klasa();

Przy tablicy dynamicznej:

Klasa* tablica = new Klasa[3];
tablica[0] = Klasa();
tablica[1] = Klasa();
tablica[2] = Klasa();

 

komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)
Mi to nie działa. Nie wiem czy nawet powinno przecież konstruktor wywołuje się przy tworzeniu obiektu a ja tworze obiekty a dopiero potem używam konstruktora.

Jak nie ma innego sposobu to użyje tablicy wskażników do obiektów klasy.
komentarz 29 listopada 2015 przez Patrycjerz Mędrzec (181,510 p.)

Nie wiem, jakim prawem ci to nie działa. Pamiętaj, że wywołanie:

Klasa();

to wywołanie konstruktora klasy.

komentarz 29 listopada 2015 przez adrian17 Mędrzec (167,340 p.)
Patrycjerz, Twój przykład nie ma sensu. Samo tworzenie tablicy już domyślnie inicjalizuje elementy, więc nie ma potrzeby ręcznego przepisywania elementów.
komentarz 29 listopada 2015 przez diablol Nałogowiec (26,480 p.)
Chodziło ci o coś takiego?: http://wklej.org/id/1861324/ mi to nie działa.
komentarz 29 listopada 2015 przez Patrycjerz Mędrzec (181,510 p.)

@diablol Nie wiem, mi taki sposób działa. Jakby co, teorię wziąłem stąd: http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node96.html.

@adrian17 Ja tylko pokazałem jeden ze sposobów tworzenia tablicy obiektów zainicjalizowanych naszymi danymi - nie wiem, czy to rozwiązanie ma sens, czy nie. Chyba chodzi ci o brak jakichkolwiek danych w konstruktorze, tak?

komentarz 29 listopada 2015 przez adrian17 Mędrzec (167,340 p.)

Chyba chodzi ci o brak jakichkolwiek danych w konstruktorze, tak?

Tak, bo w momencie w którym napisałeś

Klasa tablica[3];

Te trzy elementy już są domyślnie zainicjalizowane.

komentarz 29 listopada 2015 przez Mikrokontroler xD Stary wyjadacz (13,600 p.)

 Patrycjerz dobrze napisał.
 

Klasa tablica[3];

inicjalizowane jest ale śmieciami a nie tym czym chcemy.

tablica[0] = Klasa();

dopiero takie coś inicializuje w pełni nasze parametry a jeżeli chodzi o przykład autora powinien wykonać coś w stylu

Miecz tablica[3];
tablica[0] = Miecz("jednoreczny", 100, 10, 10);
tablica[1] = Miecz("dwureczny", 1000, 100, 100);
tablica[2] = Miecz("póltoraręczny", 500, 50, 50);

I dopiero teraz twoje parametry obiektów zostały zainicjalizowane przez Ciebie.

komentarz 29 listopada 2015 przez adrian17 Mędrzec (167,340 p.)

inicjalizowane jest ale śmieciami a nie tym czym chcemy.

Nieprawda. Gdyby klasa nie ma konstruktora, miałbyś rację. Ale jeśli ma jakikolwiek konstruktor, jak tutaj, to na każdym elemencie tablicy automatycznie wywoływany jest konstruktor domyślny.

0 głosów
odpowiedź 29 listopada 2015 przez Radfler Szeryf (98,660 p.)

Można to zrobić, przez np. inicjalizację listą (http://en.cppreference.com/w/cpp/language/list_initialization):

struct Foo {
  Foo(int, int, std::string) { }
};

Foo array[3] = {{1, 2, "one"s}, {2, 3, "two"s}, {3, 4, "three"s}}; // Wywoływanie konstruktorów

Albo ewentualnie możesz użyć inicjalizacji chyba agregatowej (http://en.cppreference.com/w/cpp/language/aggregate_initialization):

Foo array[3] = {Foo(1, 2, "one"s), Foo(2, 3, "two"s), Foo(3, 4, "three"s)};

Podobne pytania

0 głosów
2 odpowiedzi 61 wizyt
0 głosów
2 odpowiedzi 114 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez Jakub Śliż Użytkownik (940 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

61,285 zapytań

107,210 odpowiedzi

223,244 komentarzy

32,692 pasjonatów

Przeglądających: 325
Pasjonatów: 20 Gości: 305

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...