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

Klasy/dziedziczenie

Object Storage Arubacloud
0 głosów
191 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez Sensej Użytkownik (540 p.)

Witam. 

Mam do zrobienia program, w którym klasy Student i Wykładowca dziedziczą po klasie Osoba. Następnie mam następna klasę Przedmiot. Mam wyświetlić średnie z ocen itd, dla każdego studenta. Więc zrobiłem aby klasa Przedmiot dziedziczyła po klasie Student.

Mam problem ze stworzeniem obiektu i użycia funkcji. Dostaje błąd w linii 160 i 172

"error: no matching function for call to 'Osoba::addInt(std::string&, std::string&, int&, int&, int&, std::string&, int&, int&, std::string&)'|"

"error: no matching function for call to 'Osoba::dodaj(std::string&, std::string&, int&, std::string&)'|"

Na początku w funkcji main mam zakomentowane stworzenie obiektu, które działa poprawnie. Nie wiem jak to przerobić na tablicę żeby działało.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Osoba
{
public:
    string imie;
    string nazwisko;
    int wiek;

    Osoba() {}
    ~Osoba() {}


    void dodaj2(string imie, string nazwisko, int wiek)
    {
        this->imie = imie;
        this->nazwisko = nazwisko;
        this->wiek = wiek;
    }

    virtual void drukuj() {};
    virtual void addInt() {};
    virtual void dodaj() {};

};

class Student : public Osoba
{
public:
    int rok;
    int nr_indeksu;
    string kierunek;

    void dodaj(string imie, string nazwisko, int wiek, int rok, int nr_indeksu, string kierunek)
    {
        dodaj2(imie, nazwisko, wiek);
        this->rok = rok;
        this->nr_indeksu = nr_indeksu;
        this->kierunek = kierunek;
    }

    void drukuj()
    {
        cout<<"Imie i nazwisko: "<<imie<<" "<<nazwisko<<endl;
        cout<<"Wiek: "<<wiek<<endl;
        cout<<"Rok: "<<rok<<endl;
        cout<<"Numer indeksu: "<<nr_indeksu<<endl;
        cout<<"Kierunek: "<<kierunek<<endl;
    }
};

class Wykladowca : public Osoba
{
public:
    string tytul;

    void dodaj(string imie, string nazwisko, int wiek, string tytul)
    {
        dodaj2(imie, nazwisko, wiek);
        this->tytul = tytul;
    }

    void drukuj()
    {
        cout<<"Imie: "<<imie<<endl;
        cout<<"Nazwisko: "<<nazwisko<<endl;
        cout<<"Wiek: "<<wiek<<endl;
        cout<<"Tytul: "<<tytul<<endl;
    }
};


class Przedmiot : public Student
{
public:
    vector <int> oceny;
    vector <int> punkty_ECTS;
    vector <string> nazwa_przed;

    Przedmiot() {}
    ~Przedmiot() {}

    void addInt(string imie, string nazwisko, int wiek, int rok, int nr_indeksu, string kierunek, int ocena, int punkty, string nazwa)
    {
        dodaj(imie, nazwisko, wiek, rok, nr_indeksu, kierunek);
        oceny.push_back(ocena);
        punkty_ECTS.push_back(punkty);
        nazwa_przed.push_back(nazwa);
    }

    void drukuj()
    {
        cout<<"Imie i nazwisko: "<<imie<<" "<<nazwisko<<endl;
        cout<<"Wiek: "<<wiek<<endl;
        cout<<"Rok: "<<rok<<endl;
        cout<<"Numer indeksu: "<<nr_indeksu<<endl;
        cout<<"Kierunek: "<<kierunek<<endl;
        for( unsigned int i = 0; i < oceny.size(); i++ )
			{
				cout << "Ocena: " << oceny[i] << endl;
				cout << "Punkty ECTS " << punkty_ECTS[i] << endl;
				cout << "Nazwa przedmiotu " << nazwa_przed[i] << endl;
			}
			cout << endl;
    }
};


int main(int argc, char** argv)
{
/*
    Przedmiot *obj = new Przedmiot;
    obj->addInt("Patryk", "BlaBla", 21, 2017, 1251, "Informatyka", 5, 12, "Pszyra");
    obj->drukuj();


    Wykladowca *leszek = new Wykladowca;
    leszek->dodaj("Leszek", "Belka", 21, "Profsesor");
    leszek->drukuj();
*/

    int n, wiek, rok, nr_indeksu, ocena, punkty_ECTS,ile_przedmiotow;
    char wybor;
    string imie, nazwisko, kierunek, tytul, nazwa;
    cout<<"Podaj liczbe osob: "<<endl;
    cin>>n;

    Osoba** tab=new Osoba*[n];

    for(int i=0; i<n; i++)
    {
        cout<<"Kogo chcesz dodac: 0=Student || 1=Wykladowca "<<endl;
        cin>>wybor;

        switch(wybor)
        {
        case '0':
            cout<<"Podaj imie i nazwisko: "<<endl;
            cin>>imie>>nazwisko;
            cout<<"Podaj wiek: "<<endl;
            cin>>wiek;
            cout<<"Podaj rok i numer indeksu: "<<endl;
            cin>>rok>>nr_indeksu;
            cout<<"Podaj kierunek: "<<endl;
            cin>>kierunek;
            cout<<"Podaj ilosc przedmiotw: "<<endl;
            cin>>ile_przedmiotow;
            //tab[i]=new Student(imie, nazwisko, wiek, rok, nr_indeksu, kierunek);
            for(int k=0; k<ile_przedmiotow; k++)
            {
                cout<<"Podaj nazwe: "<<endl;
                cin>>nazwa;
                cout<<"Podaj ocene i punkty ECTS: "<<endl;
                cin>>ocena>>punkty_ECTS;
                tab[i]= new Przedmiot;
                tab[i]->addInt(imie, nazwisko, wiek, rok, nr_indeksu, kierunek, ocena, punkty_ECTS, nazwa);
            }
            break;

        case '1':
            cout<<"Podaj imie i nazwisko: "<<endl;
            cin>>imie>>nazwisko;
            cout<<"Podaj wiek: "<<endl;
            cin>>wiek;
            cout<<"Podaj tytul: "<<endl;
            cin>>tytul;
            tab[i] = new Wykladowca;
            tab[i] -> dodaj(imie, nazwisko, wiek, tytul);
            break;
        }
    }

    for(int m=0; m<n; m++)
    {
        tab[m]->drukuj();
    }

    delete [] tab;

    return 0;
}

 

komentarz 22 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

To trochę nie w temacie, ale dobra rada, którą kiedyś usłyszałem; jeżeli piszesz kod, to nie mieszaj języków podczas wyboru nazw dla klas/zmiennych/funkcji. Wygląda trochę śmiesznie i w miarę tego, jak kod się rozrasta, ciężej odnaleźć się w nazwach pisanych w różnych językach (np. addInt i drukuj).

Ponadto staraj się nazywać swoje funkcje, żebyś i jutro i za dwa lata był (była) w stanie stwierdzić po samej nazwie, co taka funkcja robi, a także, żeby inni programiści też mogli się tego z łatwością domyślić (znowu ten sam przykład - drukuj brzmi intuicyjnie, za to addInt już niekoniecznie). 

1 odpowiedź

0 głosów
odpowiedź 22 maja 2017 przez bartolinciu Dyskutant (7,580 p.)
Wywołujesz funkcję addInt () z parametrami na wskaźniku na obiekt typu Osoba, a ta klasa ma funkcję addInt nie przyjmującą parametrów. Tak samo z funkcją dodaj ().
komentarz 22 maja 2017 przez Sensej Użytkownik (540 p.)
Okey. Naprawiłem ten błąd program się kompiluje. Lecz mam inny problem. Przy takiej definicji obiektu:(Zmieniłem nazwę funkcji z addInt na dodaj_p)

    Przedmiot *obj = new Przedmiot;
    obj->dodaj_p("Patryk", "BlaBla", 21, 2017, 1251, "Informatyka", 5, 12, "Przedmiot_1");
    obj->dodaj_p("Patryk", "BlaBla", 21, 2017, 1251, "Informatyka", 4, 11, "Przedmiot_2");
    obj->dodaj_p("Patryk", "BlaBla", 21, 2017, 1251, "Informatyka", 3, 15, "Przedmiot_3");
    obj->drukuj();

Wektory znajdujące się w klasie przedmiot działają prawidłowo tzn. za każdym razem dodawana są wartości do niego. Ale jeżeli robię to w pętli z tablicą to już nie działa. Zostaje wtedy w wektorze tylko ostatni wczytany element.
komentarz 22 maja 2017 przez bartolinciu Dyskutant (7,580 p.)

Nie rozumiem co masz na myśli pisząc w 

jeżeli robię to w pętli z tablicą

komentarz 22 maja 2017 przez Sensej Użytkownik (540 p.)
Chodzi mi o tworzenie n obiektów w pętli for, która znajduje się w funkcji main, które tworzę przez taki zapis:

tab[i]= new Przedmiot;

tab[i]->dodaj_p(imie, nazwisko, wiek, rok, nr_indeksu, kierunek, ocena, punkty_ECTS, nazwa);

Podobne pytania

0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)
0 głosów
1 odpowiedź 642 wizyt
pytanie zadane 20 lutego 2016 w C i C++ przez Turqus Obywatel (1,420 p.)
0 głosów
3 odpowiedzi 273 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

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

...