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

Klasy/dziedziczenie

VPS Starter Arubacloud
0 głosów
187 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ź 142 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)
0 głosów
1 odpowiedź 590 wizyt
pytanie zadane 20 lutego 2016 w C i C++ przez Turqus Obywatel (1,420 p.)
0 głosów
3 odpowiedzi 261 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez akiihombre Początkujący (250 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...