Tablica obiek. odwołanie do met. klasy podrz.

0

Dzień dobry,

Po prostu przekopiuje treść zad. i to co zrobiłem, będzie szybciej i efektywniej, niż sam zacznę się rozpisywać o co mi chodzi.

(...)a) program powinien umozliwic:

  • wczytywanie informacji o osobach zwiazanych z uniwersytetem z rozroznieniem
    kategorii osoby (student, pracownik); wczytywane powinny byc dane wspolne dla
    wszystkich osob (nazwisko plec) oraz dane specyficzne dla kategorii (pensja dla
    pracownika; stypendium, rok studiow dla studenta); informacje o osobach przechowywac
    w tablicy o zunifikowanym typie.(...)
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include "Osoba.h"
#include "Student.h"
#include "Pracownik.h"

using namespace std;

int main()
{
  char imie[40],nazwisko[40];
  char sw;
  int io,rokSt,st,ps,rokU;
  cout<<"Podaj ilosc osob ktore chcesz wprowadzic: ";
  cin>>io;
  Osoba *tab = new Osoba[io];
  for(int i=0; i<io; ++i)
  {
     cout<<"Podaj imie: ";
     cin.getline(imie,40);
     cout<<"Podaj nazwisko: ";
     cin.getline(nazwisko,40);
     cout<<"Podaj rok urodzenia: ";
     cin>>rokU;
     cout<<"Podaj osobe: s-student,p-pracownik: ";
     cin>>sw;
            switch(sw)
            {
                 case 's': cout<<"Podaj rok studiow: "; 
                           cin>>rokSt;
                           cout<<"Podaj stypendium";
                           cin>>st;
                           tab[i] = Student(st,rokSt,imie,nazwisko,rokU);
                      break;
                 case 'p': cout<<"Podaj pensje: ";
                           cin>>ps;
                           tab[i] = Pracownik(imie,nazwisko,rokU);
                           **Pracownik().ustalPensje(ps);**
                     break;
                 default : "bledny wybor program zakonczy dzialanie: ";exit(1);
            }
   }  
  delete[] tab;
  system("PAUSE");
  return 0;
}

Wszystko działa (przynajmniej kompiluje) moje pytanie dotyczy pogrubionej linii, bo rozumiem, że tab[i] to obiekt typu Osoba który wskazuje na klasę Pracownik, tak ? to dlaczego odwołując się do metody klasy podrzędnej (tutaj Pracownik) wywołuje ją w ten sposób jak wyżej, a nie tab[i].ustalPensje - o.k tab[i] jest typu Osoba a tam takowej funkcji nie ma, ale jak wywołam tak: Pracownik().ustalPensje() to co to w ogóle znaczy, przecież Pracownik to klasa nie obiekt, więc trochę się zagubiłem w tym miejscu jakby mógł ktoś mnie poprawić będę wdzięczny bo coś tu nie gra.

może jeszcze podam klase student, pracownik, osoba.

#include <string.h>
#pragma once

class Osoba
{
 public:

  void ustalImie(char* i) { strcpy(imie,i); }
  void ustalNazwisko(char* n) { strcpy(nazwisko,n); }
  void ustalRokUr(int r) { rokur=r; }

  const char* podajImie() { return imie; }
  const char* podajNazwisko() { return nazwisko; }
  int podajRokUr() { return rokur; }

  void ustalDane(char* i, char* n, int r);

  Osoba() {};
  Osoba(char* i, char* n, int r);

 private:
  char imie[40];
  char nazwisko[40];
  int rokur;
  
};


#include <string.h>
#include "Osoba.h"

class Student : public Osoba
{
      private:
             int stypendium;
             int rokStudiow;
      public:
             void ustalRokSt(int nowyRs);
             void ustalStypendium(int noweSt);
             int podajStypendium();
             double dochod();
             Student(int s, int rs, char *imie, char *nazwisko, int rokUr) : Osoba(imie,nazwisko,rokUr)
             {
                         this->stypendium=s;
                         this->rokStudiow=rs;
             }
};
#include "Osoba.h"
#include <iostream>

using namespace std;

class Pracownik : public Osoba
{
      private:
             int pensja;
      public:
              void ustalPensje(int nowaPensja);
              int podajPensje();
              double podajPremie();
              double dochod();
              Pracownik::Pracownik(char *imie, char *nazwisko, int rokUr) : Osoba(imie,nazwisko,rokUr)
              {}
              Pracownik::Pracownik() {};
};
0

Krótka odpowiedź: ten kod jest napisany źle. Te twoje odwołania są błędne. Masz wyciek pamięci bo zrobiłeś tablicę 20 Osób (a nie wskaźników na osoby) a potem coś do niej znów wpychasz (ciekawe ze ci sie to w ogole skompilowalo...). To wywołanie Pracownik().cotam jest bez sensu bo ustawiasz wartosc dla obiektu ktory zaraz znika. Powinno to tam wygladac tak samo jak ze studentem

0

Masz wyciek pamięci bo zrobiłeś tablicę 20 Osób

cout<<"Podaj ilosc osob ktore chcesz wprowadzic: ";
  cin>>io;
  Osoba *tab = new Osoba[io];

To nie jest tablica 20 osób.

wywołanie Pracownik().cotam jest bez sensu

dlatego utworzyłem ten post.

Powinno to tam wygladac tak samo jak ze studentem.

chodzi o to, żeby to zrobić bez pośrednictwa konstruktora (inaczej jak w studencie) tylko za pomocą metody, w tym przykładzie: ustalPensje(), żeby ona ustawiła w obiekcie typu Pracownik atrybut pensja. To mój problem.

Ten kod jest tym samym co mój tyle, że w pełni prawidłowy, ale ja nie wiem czy mogę z góry przyjąć, czy tablica może mieć max 100 elementów, a jak będę chciał utworzyć 101 pracowników ? to jest problem, dlatego tworze własny kod.

#include "osoba.h"
#include "student.h"
#include <iostream>
#include <string.h>
#include "Pracownik.h"

using namespace std;

int main()
{
    Osoba *osoba[100];
    cout<<"Podaj ilosc osob: ";
    int n;
    cin>>n;
    for (int i=0; i<n; ++i){
    cout<<"Student(s) czy Pracownik(p): ";
    char s_p;
    cin>>s_p;
    if(s_p=='p'){
    cout<<"Podaj imie: ";
    string imie;
    cin>>imie;
    cout<<"Podaj nazwisko: ";
    string nazwisko;
    cin>>nazwisko;
    cout<<"Podaj rok urodzin: ";
    int rok_urodzin;
    cin>>rok_urodzin;
    cout<<"Podaj pensje: ";
    int pensja;
    cin>>pensja;
    osoba[i]=new Pracownik(imie,nazwisko,rok_urodzin,pensja);
    }
    else{
         cout<<"Podaj imie: ";
    string imie;
    cin>>imie;
    cout<<"Podaj nazwisko: ";
    string nazwisko;
    cin>>nazwisko;
    cout<<"Podaj rok urodzin: ";
    int rok_urodzin;
    cin>>rok_urodzin;
    cout<<"Podaj stypendium: ";
    int stypendium;
    cin>>stypendium;
    osoba[i]=new Student(imie,nazwisko,rok_urodzin,stypendium);
         }
  }
  int suma=0;
  for(int a=0; a<n; ++a)
  {
          suma=suma+osoba[a]->ZliczWydatki();
  }
  cout<<"Suma wydatkow uczelni to: "<<suma<<endl;
  system("Pause");
}

0

Może przynajmniej tak:

    cout<<"Podaj ilosc osob: ";
    unsigned n; // chyba że się spodziewasz minus siedem osób.
    cin>>n;
    Osoba **osoba=new Osoba *[n];

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