Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wekstor o typie będącym klasą

Ostatnio zmodyfikowano 2016-12-27 01:52
Autor Wiadomość
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:
C/C++
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:
C/C++
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() // (1)
        }
    }
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
P-155470
karambaHZP
» 2016-12-26 20:17:51
Do komentarza 1.
Tak samo jakbyś tworzył obiekt.
vector.push_back( Klasa( args ) );
P-155472
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.
P-155473
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.
P-155477
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?
C/C++
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.//i co?
jak odnieść się do składnika poprzez iterator?
P-155485
carlosmay
» 2016-12-26 22:20:15
C/C++
* wsk.//i co?
( * wsk ).metoda();

C/C++
#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';
}
P-155486
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
C/C++
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?
P-155488
carlosmay
» 2016-12-26 22:49:22
Przekaż vector przez referencję. Teraz jest przez wartość i wszelkie zmiany są tracone.
P-155489
« 1 » 2
  Strona 1 z 2 Następna strona