latajacaryba Temat założony przez niniejszego użytkownika |
Wekstor o typie będącym klasą » 2016-12-26 20:11:15 Witam, jestem zupełnie nowy jeśli chodzi o wektory, chciałbym się zapytać, czy typem wektora może być klasa. Spójrzcie: vektor < int > wektor; wektor.push_back( 20 );
push_back() dodaje nam element tablicy. argumentem przesyłamy wartość (w tym przypadku 20), ale co zrobić, gdy chcemy by typem była klasa? przykład: class Data { int lgodzin; int lminut; int dzien; int miesiac; string nazwa; public: Data( int godz, int minu, int day, int mon, string name ) : lgodzin( godz ) , lminut( minu ) , dzien( day ) , miesiac( mon ) , nazwa( name ) { } Data() { lgodzin = 0; lminut = 0; dzien = 0; miesiac = 0; nazwa = "brak"; } int main() { vector < Data > tablica; vector < Data >::iterator wsk = tablica.begin(); void utworz_wydarzenie( vector < Data > wektor ) { wektor.push_back() } }
Ok, co więc w punkcie jeden (1). Jak dodac nowy element i go zainicjalizować konstruktorem? W ogóle się da? Bo co zrobić, jeżeli piszę program, w którym użytkownik tworzy tyle wydarzeń, ile chce. Mógłbym stworzyć wskaźniki i dynamicznie alokować, ale wolałbym bez, to już robiłem. Z góry dzięki |
|
karambaHZP |
» 2016-12-26 20:17:51 Do komentarza 1. Tak samo jakbyś tworzył obiekt. vector.push_back( Klasa( args ) ); |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-26 20:20:58 Działa, dziękuję :) Na razie temat będzie otwarty, przynajmniej do ukończenia programu, bo wektory są dla mniej jak wspomniałem, nowością, więc może dojdzie jakieś pytanie. |
|
mokrowski |
» 2016-12-26 20:33:05 Niestety. Pełne wymagania co do klasy dla vector, jeśli wykonasz resize() lub dojdzie do realokacji (vector np. się rozszerzy lub zmniejszy), obejmują także MoveInsertable i DefaultInsertable co w dużym uproszczeniu oznacza konieczność definiowania konstruktora domyślnego w klasie. Spróbuj zrobić resize() a zobaczysz błędy. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-26 22:08:51 a jak odnieść się do składnika klasy przez iterator? class Data { friend class Godzina; int lgodzin; int lminut; int dzien; int miesiac; string nazwa; public: Data( int godz, int minu, int day, int mon, string name ) : lgodzin( godz ) , lminut( minu ) , dzien( day ) , miesiac( mon ) , nazwa( name ) { } Data() { lgodzin = 0; lminut = 0; dzien = 0; miesiac = 0; nazwa = "brak"; } }; vector < Data > tablica; vector < Data >::iterator wsk = tablica.begin(); * wsk.
jak odnieść się do składnika poprzez iterator? |
|
carlosmay |
» 2016-12-26 22:20:15 ( * wsk ).metoda(); #include <string > #include <iostream> #include <vector>
class Foo { int a; std::string s; public: Foo() = default; Foo( int n, const std::string & str ) : a { n }, s { str } { ; } int getA() const { return( this->a ); } const std::string & getS() const { return { this->s }; } };
int main() { std::vector < Foo > vec { { 1, "jeden" }, { 2, "dwa" }, { 3, "trzy" } }; std::vector < Foo >::const_iterator cit = vec.cbegin(); std::cout << cit->getA() << ' ' << cit->getS() << '\n'; ++cit; std::cout <<( * cit ).getA() << ' ' <<( * cit ).getS() << '\n'; } |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-26 22:43:38 @Carlos No tak, w sumie to przecież też wskaźnik :D Mam jeszcze jeden problem void utworz_wydarzenie( vector < Data > wektor, int dzien, int miesiac, int godzina, int minuta, string nazwa ) { wektor.push_back( Data( godzina, minuta, dzien, miesiac, nazwa ) ); }
Spójrzcie proszę, na powyższy kod, kiedy wywołam tę funkcję, i wypisze na ekran rozmiar tego wektora, wychodzi 0. Dlaczego? |
|
carlosmay |
» 2016-12-26 22:49:22 Przekaż vector przez referencję. Teraz jest przez wartość i wszelkie zmiany są tracone.
|
|
« 1 » 2 |