radek04 Temat założony przez niniejszego użytkownika |
[C++] Wskaźnik do obiektu. Jak przesunąć na kolejny obiekt. » 2015-04-05 16:46:51 Mam utworzoną klasę Osoba z polami w postaci danych osobowych (Imię, Nazwisko itp.). Po utworzeniu wszystkich obiektów (person_0, person_1 ... person_5) program ma sprawdzić, czy wszystkie dane zostały uzupełnione. W przypadku braku jakiejkolwiek, wywołuję destruktor. Chcę to zrobić w pętli. Próbowałem z użyciem referencji i wskaźników, ale stanąłem na przesunięciu wskaźnika na kolejny obiekt. Można to jakoś zrobić? Jestem początkujący zarówno w klasach, jak i wskaźnikach. Osoba * sprawdzany;
for( sprawdzany = & person_0; i < 6; i++ ) { cout << "Sprawdzam kompletnosc danych osobowych obiektu " << sprawdzany->Imie << " " << sprawdzany->Nazwisko << "."; if( sprawdzany->Imie == "brak" || sprawdzany->Nazwisko == "brak" || sprawdzany->Data_urodzenia == "brak" || sprawdzany->Plec == "brak" || sprawdzany->Miasto == "brak" ) { sprawdzany->~Osoba(); } else { cout << "\nDane kompletne.\n\n"; } sprawdzany++; }
Zamiast sprawdzany++ próbowałem też sprawdzany += sizeof( Osoba ) Powyższy kod oczywiście nie kompiluje się z powodu różnych typów Osoba i int, albo operatora ++ lub += (w zależności od moich różnych kombinacji i wariacji gwiazdek *, ampersandów &, operatorów rzutowania itp.). |
|
Monika90 |
» 2015-04-05 16:55:00 Co to jest person_0? Jawne wywoływanie destruktora zostaw ekspertom. Z tego co widzę to nie jest wskaźnik do elementu tablicy, więc zwiększanie go o jeden nie skończy się dobrze. Jeżeli chcesz mieć kilka obiektów klasy Osoba, to użyj tablicy, albo std::vector<Osoba> |
|
radek04 Temat założony przez niniejszego użytkownika |
» 2015-04-05 17:13:35 Tak, dobrze piszesz. Ale takie mam zadanie, by jawnie wywołać destruktor. I ma być bez tablicy. person_0 to pierszy obiekt klasy Osoba. Zakładając (o ile to ma sens), że ww. obiekty są umieszczone w pamięci obok siebie, czy da się jakoś przesuwać wskaźnik między nimi (podobnie jak w tablicy)? |
|
Monika90 |
» 2015-04-05 17:23:18 Zakładając (o ile to ma sens), że ww. obiekty są umieszczone w pamięci obok siebie, czy da się jakoś przesuwać wskaźnik między nimi (podobnie jak w tablicy)? |
Jeżeli to są zmienne lokalne to nie można czynić takich założeń. Ale takie mam zadanie, by jawnie wywołać destruktor. I ma być bez tablicy.
|
Można alokować tablicę bajtów w której pomieści się n obiektów i tworzyć te obiekty za pomocą placement new, wtedy będzie można wywoływać jawnie destruktor. No ale jak nie ma być tablicy to tak się nie da, w tej sytuacji jedyne co mi przychodzi do głowy to unia. Składowe unii można (trzeba) jawnie tworzyć i jawnie niszczyć. |
|
radek04 Temat założony przez niniejszego użytkownika |
» 2015-04-05 17:33:46 Cały projekt mam w 1 pliku main.cpp. Klasa jest zadeklarowana na początku pliku, więc jest globalna. Obiektu są tworzone w czasie trwania programu, ale między nimi nie jest definiowany żadna zmienna, funkcja, czy jakikolwiek inny obiekt. Tablicy ma nie być do obiektów, poza tym nie będzie problemu, jeśli jej użyję.
Oczywiście mogę każdy obiekt sprawdzić po kolei (jest ich tylko 6). Szukam rozwiązania do sprawdzenia w pętli, ale tylko tak, by miało to "ręce i nogi". Nic na siłę. Więc proszę o rozwiązanie, jeśli będzie sensowne.
To projekt na zajęcia, stąd takie dziwne założenia.
|
|
pekfos |
» 2015-04-05 17:35:55 Alokuj obiekt dynamicznie, wtedy ręcznie go zwalniając, siłą rzeczy wywołujesz destruktor. A co do tablicy.. Typ & tablica( std::size_t i ) { switch( i ) { case 0: return obj0; case 1: return obj1; case 2: return obj2; } }
tablica( 3 ) = costam;
|
|
Monika90 |
» 2015-04-05 17:42:09 Najlepiej pokaż treść tego zadania |
|
notabigthreat |
» 2015-04-05 17:43:28 Tablicy ma nie być do obiektów, ale czy może być tablica wskaźników na obiekty? |
|
« 1 » 2 3 |