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

[C++] Wskaźnik do obiektu. Jak przesunąć na kolejny obiekt.

Ostatnio zmodyfikowano 2017-06-26 07:23
Autor Wiadomość
radek04
Temat założony przez niniejszego użytkownika
» 2015-04-05 17:46:52
Raczej tak, może być.

Treść zadania:
1. Utwórz klasę osoba, która będzie przechowywała elementarne dane
osobowe (imię, nazwisko, data urodzenia, płeć, miasto) oraz pole
identyfikatora typu int o nazwie id.
2. Identyfikator danej osoby powinien być unikalny dla każdego
obiektu i automatycznie nadawany w momencie tworzenia obiektu klasy
osoba.
3. Utwórz funkcje składowa klasy, która zwróci numer ostatnio
nadanego identyfikatora w klasie osoba. Funkcja powinna być możliwa
do wywołania nawet gdy nie istnieje żaden obiekt klasy osoba.
4. Zdefiniuj wewnątrz klasy osoba konstruktory które umożliwią
tworzenie obiektów tej klasy na okoliczność podania różnych danych
nowo tworzonej osoby.
5. Zdefiniuj w klasie osoba funkcję pozwalającą na przedstawienie
obiektów z danej klasy.
6. Dodaj do klasy osoba pole które zwróci ilość aktualnie
istniejących obiektów klasy osoba.

Dodatkowo jest warunek, by destruktor usuwał obiekty z niepełnymi danymi osobowymi.

A propos tablicy obiektów, to może (bardziej dla ćwiczeń), spróbuję też z tablicą obiektów.
Niestety to, co pisał pekfos, nie do końca rozumiem, a póki co słabo z czasem, by się tego uczyć.
P-130197
notabigthreat
» 2015-04-05 18:27:11
To może zrób tą tablicę wskaźników i ustaw ją na osoby. Plus minus coś takiego:
C/C++
//...
Osoba * wskazniczki_hehe[ 6 ];
//ustawienie wskaźników leci tutaj...
//...
for( int i = 0; i < 6; ++i )
{
    cin >> wskazniczki_hehe[ i ]->Imie;
    //...
}
//...
Jest jeszcze inna, wydaje się, znacznie prostsza opcja: stwórz konstruktor dla klasy Osoba tylko taki, który ustawia już wszystkie pola. W ten sposób nigdy nie musisz wywoływać destruktora (zgodnie z treścią zadania - w końcu odpowiednie zmienne za każdym razem ustawiasz). Nie wiem, czy coś takiego jest tu dopuszczalne.
C/C++
//...
class Osoba
{
    //moge byc tu nawet prywatne - w koncu ustawia je konstruktor
    string imie;
    string nazwisko;
public:
    Osoba( string jakie_ma_byc_imie, string jakie_ma_byc_nazwisko )
    {
        if(( jakie_ma_byc_imie == "" ) ||( jakie_ma_byc_nazwisko == "" ) )
        //źle - ma coś być
             imie = jakie_ma_byc_imie;
       
        nazwisko = jakie_ma_byc_nazwisko;
    }
};

int main()
{
    //Osoba osob1; // blad - nie ma takiego konstruktora, zeby go wywolac bez argumentow
    //Ososba osob2();// to samo
    Osoba osob3( "Jan", "Kowalski" ); //OK
    string im_wczyt;
    string nazw_wczyt;
    cin >> im_wczyt >> nazw_wczyt;
    Osoba osob4( im_wczyt, nazw_wczyt ); //OK
}
Logicznie (?) - jak klasa ma jakieś pola, to niech sama o nie zadba! Tak, wiem, trochę cwaniacko wyszło.
P-130200
radek04
Temat założony przez niniejszego użytkownika
» 2015-04-05 18:31:33
Tak właśnie (a przynajmniej podobnie) zrobiłem. Każde pole z danymi osobowymi jest typu string i ma wstępnie wartość "brak".
A program usuwa (wywołuje destruktor) obiekty, które mają ww. pola właśnie z wartością "brak".

Edit. A jak ustawić wskaźnik?
wskazniczki_hehe[ i ] = Osoba
Chyba nie tak???
P-130201
notabigthreat
» 2015-04-05 18:39:35
C/C++
wskazniczki_hehe[ i ] = new Osoba( /* argumenty dla konstruktora */ );
Ewentualnie "na chama": stworzyć obiekt, a później zająć się wskaźnikiem.
C/C++
Osoba ja( "radek", "04" );
//...
wskazniczki_hehe[ i ] = & ja;
//...
@EDIT:
Jestem (na dość niewiele procent, ale jednak) pewien, że do jutra spotkasz kogoś o nazwisku "brak". Tak, małą literą. A w ogóle, to może niech obiekt sam się dekonstruuje, jak zobaczy, że czegoś nie ma, np. po wywołaniu jakiejś funkcji?
C/C++
void SprawdzCzyWszystkoJest()
{
    if( nie ma wszystkiego )
         this->~Osoba();
   
}
P-130204
Monika90
» 2015-04-05 19:04:25
W zadaniu nic nie ma o tym by jawnie wywoływać destruktor, więc nie rób tego, bo nie wiesz jak to działa i jakie ma konsekwencje.

Nie widzę też tam zakazu używania tablic.
P-130206
radek04
Temat założony przez niniejszego użytkownika
» 2015-04-05 19:30:17
O destruktorze było dopowiedziane na zajęciach. Co do tablic, to OK, zgadzam się, że nie ma zakazu. Jednak moje pytanie dotyczy przypadku bez tablicy obiektów. Jeśli tego się nie da zrobić, to OK. Aleśli można, to chcę sie dowiedzieć jak. Niekoniecznie muszę zaraz tego użyć, bo nie lubię używać rzeczy, których nie rozumiem.
Czy operator new pozwoli na "przesuwanie" wskaźnika (z tablicy) na kolejne obiekty danej klasy?
P-130209
notabigthreat
» 2015-04-05 19:54:32
Nie za bardzo. Te osoby nie muszą być koło siebie. Pomimo tego, wskaźniki na osoby SĄ rozmieszczone jeden po drugim w tablicy wskazniczki_hehe. Z tego powodu możesz przesuwać wskaźnik na wskaźniki za pomocą ++ i --.
P-130212
radek04
Temat założony przez niniejszego użytkownika
» 2015-04-05 20:16:25
Mogę prosić o konkretny przykład, jak mógłbym tego użyć?
P-130214
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona