• 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

VPS Starter Arubacloud
0 głosów
3,784 wizyt
pytanie zadane 29 listopada 2015 w C i C++ przez Patryk Krajewski Nałogowiec (26,170 p.)
przywrócone 29 listopada 2015 przez Patryk Krajewski
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 Ekspert (344,100 p.)
wybrane 29 listopada 2015 przez Patryk Krajewski
 
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 Patryk Krajewski Nałogowiec (26,170 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 Ekspert (344,100 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 Patryk Krajewski Nałogowiec (26,170 p.)
Dziękuje właśnie o to mi chodziło.
komentarz 29 listopada 2015 przez Patryk Krajewski Nałogowiec (26,170 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 (192,340 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 Patryk Krajewski Nałogowiec (26,170 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 (192,340 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 Patryk Krajewski Nałogowiec (26,170 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 (192,340 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 Patryk Krajewski Nałogowiec (26,170 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 (192,340 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 Ekspert (344,100 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 Patryk Krajewski Nałogowiec (26,170 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 (192,340 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 Ekspert (344,100 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,500 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 Ekspert (344,100 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 VIP (101,030 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 438 wizyt
0 głosów
2 odpowiedzi 213 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez Jakub Śliż Użytkownik (940 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...