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

Inicjalizacja struktury

Mały hosting, OGROMNE możliwości
0 głosów
862 wizyt
pytanie zadane 13 lutego 2019 w C i C++ przez DarthMazut Bywalec (2,990 p.)

Witam,

zdefiniowałem następującą strukturę:

struct Area
{
	short X;
	short Y;
	const short width;
	const short height;
	vector<CHAR_INFO> fields;

    Area()
    {

    }
};

chciałbym zapytać jak mogę nadać początkowe wartości jej zmiennym, w szczególności chodzi mi o te z modyfikatorem const. Tworząc później taką strukturę należałoby podać w konstruktorze wartości 'width' oraz 'height', które byłby wyłącznie do odczytu, np. Area a1(5,5);

Po drugie chciałem zapytać o to jak zainicjalizować wektor. Póki co, w konstruktorze struktury próbowałem używać metoy resize() oraz reserve(). Czy robi się to w taki sposób? Czym różnią się te metody?

Przy okazji chciałem zapytać czy definicja takiej struktury powinna znajdować się w pliku nagłówkowym czy należałoby ją przenieść do oddzielnego pliku?

Pozdrawiam.

2 odpowiedzi

+2 głosów
odpowiedź 13 lutego 2019 przez j23 Mędrzec (195,220 p.)
    Area(short w, short h)
    : width(w), height(h) 
    {}

 

Czy robi się to w taki sposób?

Zależy.

Czym różnią się te metody?

resize zmienia rozmiar vectora, reserve rezerwuje miejsce pod przyszłe elementy, po to żeby zredukować ilość realokacji pamięci.

komentarz 13 lutego 2019 przez DarthMazut Bywalec (2,990 p.)
Dzięki za podpowiedź ;)

co do wektora to może przeredaguje moje pytanie:

otóż deklaruję wektor:

vector<CHAR_INFO> fields;

i teraz pytam się: jaki sposób byłby najlepszy, żeby określić długość tego wektora?

fields.resize() działa, ale czy to prawidłowy sposób?
komentarz 13 lutego 2019 przez j23 Mędrzec (195,220 p.)

Możesz użyć resize, możesz też ustalić jego wielkość w liście inicjalizacyjnej konstruktora Area. Wybór sposobu zależy od tego, co dokładnie chcesz zrobić.

komentarz 13 lutego 2019 przez DarthMazut Bywalec (2,990 p.)

Użyję resize(), ale zapytam jeszcze z ciekawości jak by wyglądało ustalenie długości wektora w liście inicjalizacyjnej? Możesz podać przykład? smiley

komentarz 13 lutego 2019 przez j23 Mędrzec (195,220 p.)
Area(short w, short h)
: width(w), height(h), fields(w * h)
{}

 

komentarz 13 lutego 2019 przez DarthMazut Bywalec (2,990 p.)

Super!

Dziękuję bardzo smiley

0 głosów
odpowiedź 13 lutego 2019 przez dawid2002 Mądrala (5,190 p.)

Jeśli chodzi o inicjalizację stałych można zrobić tak jak opisał to j23 , czyli używając listy inicjalizacyjnej do określenia wartości początkowym tym stałym.

Można też zrobić to tak:

Area a{1,1,50,100,'a'};     // inicjalizacja składników struktury

cout << width << endl; // wartosc 50
cout << height << endl; // wartosc 100

Wtedy podczas deklaracji struktury , inicjalizujemy jej wartosci.

Oczywiście jest jeszcze jeden sposób (którego nie polecam) , można jeszcze zrobić tak:

struct Area
{
    // inicjalizujemy wartosci poczatkowe:
    short X = 23;
    short Y = 34;
    const short width = 134;
    const short heigh = 234t;
    vector<CHAR_INFO> fields = "a";
 
    Area()
    {
 
    }
};

 

Jeśli chodzi o resize() i reserve() to opisał to już wspomniany kolega j23.

komentarz 13 lutego 2019 przez DarthMazut Bywalec (2,990 p.)
Dziękuję za odpowiedź :)

myślę, że zmienne X i Y mogłyby otrzymać wartości domyślne '0' wg. tego drugiego sposobu, który podałeś, natomiast definiowanie wartości 'width' oraz 'height' na sztywno nie wchodzi w grę, co więcej długość wektora musi być równa width*height, stąd lista inicjalizacyjna również odpada.
komentarz 13 lutego 2019 przez dawid2002 Mądrala (5,190 p.)
Okej ale vector ten w sumie nie jest stały więc było by można np: napisać funkcje która by przypisała wartość temu vectorowi na width*height (vector wiem że nie jest typem liczbowym ale było bu można użyć konwersji za pomocą funkcji do takich konwersji lub użyć rzutowania).
komentarz 13 lutego 2019 przez DarthMazut Bywalec (2,990 p.)

Chodzi o długość wektora, a nie jego wartość. Wektor zanim będzie uzupełniony wartościami musi być zadeklarowany do przodu na pewną ilość elementów, ponieważ funkcja do której posyłam wskaźnik na niego będzie go traktować jak tablicę o width*height liczbie elementów, którą należy uzupełnić. Użyję resize() tak jak doradził j23smiley

Podobne pytania

0 głosów
1 odpowiedź 546 wizyt
pytanie zadane 29 sierpnia 2022 w C i C++ przez Mate0 Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 442 wizyt
pytanie zadane 2 sierpnia 2022 w C i C++ przez Kuba Kaleta Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 510 wizyt

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

63,266 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...