obiekty klasy bazowej

0

Witam serdecznie,

Mam następujący problem, otóż mając następujący kod

 class Czlowiek
{
public: string imie, nazwisko;
int zamowienie;
    public: 
    void pij()
    {
    cout << "Ile zamawiasz?" << endl;
    cin >> zamowienie;
    }

    string przedstawsie()
    {
    cout << "Przedstaw sie, podaj imie, wcisnij enter, podaj nazwosko" << endl;
    cin >> imie;
    cin >> nazwisko;
    }

};

class Student : public Czlowiek
{
int NrIndeksu;

};

class Pracownik : public Czlowiek
{

};

int main(int argc, char *argv[]) {

    int dlugosc, losowanie;
    Student student;
    Pracownik pracownik;

    cout << "Podaj dlugosc kolejki przy ladzie" << endl;
    cin >> dlugosc;
    Czlowiek tablica[dlugosc];
    for(int i = 0; i < dlugosc; i++)
    {
        losowanie = rand() % 2 + 1;
            if(losowanie == 1)
            {
                tablica[i] = student;
            }
            else
            {
                tablica[i] = pracownik;
            }
    }

W jaki sposób mogę odwołać się do obiektu klasy student lub pracownik poprzez elementy tablicy "tablica"?
Bo teraz odwołuje się to klasy "Czlowiek", które jest bazową klasą oby wyżej wspomnianych klas i np. chcąc napisać inną metodę o takiej samej nazwie w klasie student i pracownik, które robił by co innego i potem wywołując tę metodę poprzez dany element tablicy "tablica" w zależności czy ten element był by obiektem klasy student czy pracownik działo by się co innego.

if(losowanie == 1)
            {
                tablica[i] = student;
            }
            else
            {
                tablica[i] = pracownik;
            } 

Teraz w zależności od wartości zmiennej losowanie danemu elementowi tablicy przypisuje obiekt student lub pracownik, lecz te obiekty i tak odwołują się do klasy człowiek a nie tak jak ja bym chciał do klasy Student lub Pracownik.

Z góry dziękuję za pomoc.

1

Czlowiek **tablica=new Czlowiek*[dlugosc];
tablica[i] = new student;
tablica[i] = new pracownik;

1
  1. Funkcje które chcesz tak "nadpisać" muszą mieć słówko virtual np.
    virtual void przedstawsie()
  2. Tablica którą operujesz musi być tablicą wskaźników, nie obiektów.
    Jeśli przypisujesz OBIEKT klasy pochodnej do OBIEKTU klasy bazowej to następuje "przycięcie" tego obiektu i tracisz te "pochodne" elementy. Musisz operować tutaj wskaźnikami (ewentualnie referencjami, ale moze to być później błędogenne więc odradzam).
0

powiedz mi na co pokazuje to

 Student * student;

nie masz utworzonego obiektu student, jedynie wskaznik na niego. Operujesz na czyms czego nie ma.
Watpie zebys mial narzucone ze ma byc to tablica obiektow. Polimorfizm nie ma najmniejszego sensu tutaj. A rozwiazanie ktore robisz jest zle, bo nie powinno sie takich rzeczy definiowac na stosie

0

A coś takiego? Dlaczego wyskakuje błąd cannot convert 'Student' to 'Czlowiek*' in assignment

#include <iostream>
#include <time.h>
#include <stdlib.h> 
using namespace std;

class Czlowiek
{
public: string imie, nazwisko;
int zamowienie;
    public: 
    void pij()
    {
    cout << "Ile zamawiasz?" << endl;
    cin >> zamowienie;
    }

    virtual void przedstawsie()
    {
    cout << "Przedstaw sie, podaj imie, wcisnij enter, podaj nazwosko" << endl;
    cin >> imie;
    cin >> nazwisko;
    }

};

class Student : public Czlowiek
{
int NrIndeksu;

    virtual void przedstawsie()
    {
    cout << "Przedstaw sie, podaj numer indeksu" << endl;
    cin >> NrIndeksu;
    }
};

class Pracownik : public Czlowiek
{

};

int main(int argc, char *argv[]) {

    int dlugosc, losowanie;
    Student * student = new Student;
    Pracownik * pracownik = new Pracownik;

    cout << "Podaj dlugosc kolejki przy ladzie" << endl;
    cin >> dlugosc;
    Czlowiek ** tablica = new Czlowiek*[dlugosc];
    for(int i = 0; i < dlugosc; i++)
    {
        losowanie = rand() % 2 + 1;
            if(losowanie == 1)
            {
                tablica[i] = * student;
                cout << "student" << endl;
            }
            else
            {
                tablica[i] = * pracownik;
                cout << "pracownik" << endl;
            }
    }

    for(int i = 0; i < dlugosc; i++)
    {
        tablica[i]->przedstawsie();
        tablica[i]->pij();
    }

    for(int i = 0; i < dlugosc; i++)
    {

    }

    return 0;
} 
0

bo nawet nie wiesz za bardzo jak zapisac to co Ty chcesz

 Czlowiek ** tablica = new Czlowiek*[dlugosc];

a przypisujesz OBIEKT do tej tablicy (ktora sklada sie ze wskaznikow).

zamiast dawac kod i pisac "a to? a dlaczego?" napisz co dokladnie chcesz zrobic (swoj tok myslenia). Pogoogluj, posiedz nad tym z debuggerem.

0

ok, już działa jak chciałem :) ale nie rozumiem jednej rzeczy, mianowicie mam coś takiego

for(int i = 0; i < dlugosc; i++)
    {
        losowanie = rand() % 2 + 1;
            if(losowanie == 1)
            {
                Student * student = new Student;
                tablica[i] = student;
                cout << "Student" << endl;
            }
            else
            {
                Pracownik * pracownik = new Pracownik;
                tablica[i] = pracownik;
                cout << "Pracownik" << endl;
            }
    } 

nie rozumiem, dlaczego mogę przy każdym obejściu pętli for utworzyć wskaźnik do obiektu typu Student lub Pracownik, za każdym razem o takiej samej nazwie i kolejne utworzenie tego wskaźnika dajmy na to typu Student nie nadpisze utworzonego w poprzednim obejściu pętli for skoro on nazywa się tak samo ( przy założeniu oczywiście, że w poprzednich obejściach był już tworzony wskaźnik do obiektu typu Student)

0

do poczytania

  • co robi new
  • co to jest zasieg zmiennych

majac dwa wskazniki pokazujacy na jeden adres, mimo ze jeden wskaznik przestanie istniec, nadal bedzie istnial ten drugi (analogia tablica oraz zmienna)

0

Bezpośrednia odpowiedź:

for(int y=0;y<5;++y,cout<<endl) for(int x=0;x<10;++x) cout<<'*';

W powyższym kodzie też się dziwisz że zmienna x za każdym przejściem zewnętrznego for'a zaczyna od zera mimo że nazywa się tak samo?

Jak ludzi potrafią sobie życie utrudnić !!
To jest dokładnie to samo tylko że bez wyświetlenia:

for(int i=0;i<dlugosc;++i) tablica[i]=rand()&1?new Pracownik:new Student;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0