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

C++ Wektor klasy

Object Storage Arubacloud
0 głosów
3,027 wizyt
pytanie zadane 24 września 2016 w C i C++ przez rubiikk Obywatel (1,900 p.)

Cześć, słuchajcie. Mam następujący wektor opierający się na klasie. Chciałbym teraz edytować konkretne pole w wektorze. Obecnie wyświetlam odpowiedni element wektora (id, imie, nazwisko, wiek, numer telefonu), ale chciałbym teraz edytować konkretne pole w tym wektorze - przykładowo wiek wybranego pacjenta. Jak to zrobić? Ktoś może podrzucić jakąś radę?

 std::vector<Patient> patients;

//dalszy kod

patients.push_back(Patient{id, name, surname, age, phone_number});

 

6 odpowiedzi

+1 głos
odpowiedź 24 września 2016 przez Michał Muzyka Pasjonat (24,080 p.)
wybrane 24 września 2016 przez rubiikk
 
Najlepsza

tak jak w tablicy:
 

patients[3].surname = 10;

 

komentarz 24 września 2016 przez unknown Nałogowiec (39,560 p.)
Żeby zadziałało to wszystkie zmienne musiałyby być publiczne co łamałoby założenia enkapsulacji.
komentarz 24 września 2016 przez rubiikk Obywatel (1,900 p.)
Tak, unkown wyprzedził mnie i powiedział o obecnym problemie. Zmienne w klasie są prywatne, czyli teraz muszę... Co najprościej w takiej sytuacji zrobić?
komentarz 24 września 2016 przez MichuDev Pasjonat (20,300 p.)
To nie jest najlepsze rozwiązanie przeczytaj moją odpowiedź!
komentarz 24 września 2016 przez Michał Muzyka Pasjonat (24,080 p.)

dodać funkcje ustanawiające zmienne

patients[3].setSurname(10);

 

komentarz 26 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Lub settery i gettery, a wazystko moze zostac prywatne
+1 głos
odpowiedź 24 września 2016 przez unknown Nałogowiec (39,560 p.)
//edycja 3 elementu vector'a
//stwórz sobie settery
patients[2].setAge(23);

 

1
komentarz 24 września 2016 przez MichuDev Pasjonat (20,300 p.)

A co jak w wektorze jest jeden lub dwa elementy ?

  • Program się wywali ?
  • Będzie wyciek pamięci ?
  • Zostanie zgłoszony wyjątek ?

To niezdefiniowane zachowanie, nie warto z niego korzystać. Jeśli wiemy, że jest tyle elementów jest to dobre, a nawet lepsze, ale jeśli nie wiemy, lepiej użyć metody at!

1
komentarz 24 września 2016 przez unknown Nałogowiec (39,560 p.)

A co jak w wektorze jest jeden lub dwa elementy ?

To był tylko przykład...

Program się wywali ?

Być może, nie wiadomo.

Będzie wyciek pamięci ?

Chyba nie rozumiesz czym jest wyciek pamięci.

Zostanie zgłoszony wyjątek ?

Operator [] nie rzuca wyjątków, ale zawsze można go przeciążyć tak by rzucał.

Jeśli wiemy, że jest tyle elementów jest to dobre, a nawet lepsze, ale jeśli nie wiemy, lepiej użyć metody at!

Przecież zawsze wiemy ile jest elementów w wektorze.

komentarz 24 września 2016 przez MichuDev Pasjonat (20,300 p.)
Jak tworzysz funkcję, to nie raczej nie raz ją wywołasz, możesz do niej przesłać takie dane, które mogą spowodować błąd np. pusty wektor, kiedy ktoś zakładał, że on będzie miał min. 3 elementy... Albo to sprawdza, albo używa funkcji at.
komentarz 24 września 2016 przez unknown Nałogowiec (39,560 p.)
Istnieje metoda size.
komentarz 24 września 2016 przez MichuDev Pasjonat (20,300 p.)
Masz rację, można to sprawdzić, ale jak się tego nie zrobi mogą się dziać dziwne rzeczy!
+1 głos
odpowiedź 24 września 2016 przez MichuDev Pasjonat (20,300 p.)
Jeśli jesteś pewien, że tam coś jest rób tak jak przy tablicach, jednak w przypadku gdy nie wiesz czy tam coś jest (może być to większe niż ilość obiektów użyj funkcji at). Funkcja at zwraca wyjątek w razie niepowodzenia, a użycie tego jak tablicy w przypadku elementu o nieistniejącym indeksie, standard mówi o niezdefiniowanym zachowaniu czyli nie warto czegoś takiego robić!
0 głosów
odpowiedź 24 września 2016 przez rubiikk Obywatel (1,900 p.)

Czyli reasumując. Najłatwiej edytować tak, jak element tablicy:

patients[3].surname = 10;

ale tutaj pojawia się problem enkapsulacji danych. W takim wypadku może powinienem zrobić zaprzyjaźnioną funkcję, która będzie edytować prywatne dane?

1
komentarz 24 września 2016 przez unknown Nałogowiec (39,560 p.)
komentarz 24 września 2016 przez rubiikk Obywatel (1,900 p.)
Aaa, dobra, chyba będę wiedział - jeżeli nie, to zadam tutaj jeszcze pytanie. Dzięki za radę. W sumie, to w moim kodzie i klasach mam już gettery (dobrze mówię?), które wyświetlają na przykład dane o pacjencie.

  void say_hello() const;
   void one_patient() const;
komentarz 24 września 2016 przez adrian17 Ekspert (344,860 p.)
komentarz 24 września 2016 przez rubiikk Obywatel (1,900 p.)
Czyli o co chodzi? Powinienem stworzyć po prostu strukturę?
komentarz 24 września 2016 przez adrian17 Ekspert (344,860 p.)
Rób to, co najbardziej pasuje Tobie i Twojemu projektowi. To tylko jedna z wielu serii zaleceń, nikt nie powie obiektywnie która jest najlepsza.
0 głosów
odpowiedź 26 września 2016 przez rubiikk Obywatel (1,900 p.)
Cześć, słuchajcie, a mam jeszcze takie pytanie. W jaki sposób najprościej posortować vektory po konkretnym atrybucie? Na przykład chcę wypisać malejąco pacjentów według wieku? Potrzebna jest mi do tego struktura, czy bez problemu za pomocą samej klasy obsłużę sortowanie?

 sort(doctors.begin(), doctors.end(), ???);
1
komentarz 27 września 2016 przez unknown Nałogowiec (39,560 p.)
edycja 27 września 2016 przez unknown

Przykład:

#include <iostream>
#include <vector>
#include <string>
#include <random>
#include <algorithm>

class Patient{
  std::string name;
  int age;
public:
  Patient(int a):name{"unknown"},age{a}{}
  friend bool compare_age(const Patient&, const Patient&);
  friend bool compare_name(const Patient&, const Patient&);
  void print() const{
    std::cout<<"Name: "<<name<<" age: "<<age<<'\n';
  }
};

bool compare_age(const Patient& a, const Patient& b){return a.age > b.age;} 

int main(){
  std::mt19937_64 mt{}; //brak ziarna
  std::uniform_int_distribution<int> dstr{20,40};
  std::vector<Patient> vec{};
  for(int i = 0; i < 5; ++i){
    int temp = dstr(mt);
    vec.push_back({temp});
  }
  std::sort(vec.begin(), vec.end(), compare_age);
  for(const auto& it : vec)
    it.print();
}

 

komentarz 27 września 2016 przez rubiikk Obywatel (1,900 p.)
Wszystko działa u mnie, dziękuję za przykład.
0 głosów
odpowiedź 27 września 2016 przez rubiikk Obywatel (1,900 p.)
Hmm... a ktoś mógłby jeszcze podpowiedzieć, jak wyszukać na przykład ID z danych w wektorze?

Podobne pytania

0 głosów
1 odpowiedź 245 wizyt
0 głosów
1 odpowiedź 1,349 wizyt
0 głosów
2 odpowiedzi 229 wizyt
pytanie zadane 4 kwietnia 2016 w C i C++ przez trolin99 Początkujący (270 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...