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

Inicjalizacja struktury

Object Storage Arubacloud
0 głosów
425 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 (194,920 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 (194,920 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 (194,920 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ź 159 wizyt
pytanie zadane 29 sierpnia 2022 w C i C++ przez Mate0 Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 243 wizyt
pytanie zadane 2 sierpnia 2022 w C i C++ przez Kuba Kaleta Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 213 wizyt

92,536 zapytań

141,376 odpowiedzi

319,449 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...