Klasy błąd

0

Witam!, ledwo co rozpocząłem przygode z klasami w c++ i już mam błędy, dlatego też proszę o pomoc w rozwiązaniu tego problemu.

Kod:

#include<iostream>
using namespace std;

class Uczen
{
      private: 
               string imie,nazwisko;
               float o1,o2,o3;
      public:
               void setImie(){cin >> imie;this->imie=imie;}
               void setNazwisko(){cin >> nazwisko;this->nazwisko=nazwisko;}
               void setO1(){cin >> o1;this->o1=o1;}
               void setO2(){cin >> o2;this->o2=o2;}
               void setO3(){cin >> o3;this->o3=o3;}
               string getImie(){return imie;}
               string getNazwisko(){return nazwisko;}
               float getO1(){return o1;}
               float getO2(){return o2;}
               float getO3(){return o3;}
               float srednia(float o1, float o2, float o3){return (o1+o2+o3)/3;}
               Uczen(string imie, string nazwisko, float o1, float o2, float o3)
               {
                            this->imie=imie;
                            this->nazwisko=nazwisko;
                            this->o1=o1;
                            this->o2=o2;
                            this->o3=o3;
               }
               void info()
               {
                    cout << "Imie: " << imie;
                    cout << "\nNazwisko: " << nazwisko;
                    cout << "\nOceny: " << o1 << " " << o2 << " " << o3 << "\n";
                    cout << "\nSrednia: " << srednia(o1,o2,o3) << "\n";
               }
               Uczen(const Uczen & ucz)
               {
                           imie=ucz.imie;
                           nazwisko=ucz.nazwisko;
                           o1=ucz.o1;
                           o2=ucz.o2;
                           o3=ucz.o3;
               }
};


int main()
{
    Uczen ucz;   // błąd
    ucz.setImie();
    ucz.setNazwisko();
    ucz.setO1();
    ucz.setO2();
    ucz.setO3();
    ucz.info();
    system("pause");
}
 

Błędy

F:\Dev-Cpp\uczen.cpp In function int main()': 49 F:\Dev-Cpp\uczen.cpp no matching function for call to Uczen::Uczen()'
note F:\Dev-Cpp\uczen.cpp:37 candidates are: Uczen::Uczen(const Uczen&)
note F:\Dev-Cpp\uczen.cpp:37 Uczen::Uczen(std::string, std::string, float, float, float)

Z góry dziękuje!

0

W momencie gdy określasz jakikolwiek konstruktor, kompilator przestaje wtedy automatycznie generować bezargumentowy konstruktor domyślny. W takiej sytuacji musisz go sam utworzyć.

0

hmm:D Napisałeś bardzo szczególny kod, bo jest to klasa, której nie da się utworzyć w żaden sposób obiektu:D
Już tłumaczę dlaczego:
W konstruktorze przyjmujesz jako parametr, referencje do obiektu typu uczeń, a skąd masz wziąć ten pierwszy argument, skoro potrzebujesz jakiegoś na stracie, żeby go utworzyć..:)
Może to brzmi skomplikowanie, ale to co napisałeś, to skomplikowany hack:D
Chociaż jakby się zastanowić, to może byłby sposób, utworzyć ten obiekt, za pomocą rzutowania i wskaźników, ale to byłby kod dziwak, nie nadający się do użytku, tylko raczej do pokazania, że na siłę się da:D

0

Uwaga, to jest kod z założeniem, że nie ma tego konstruktora dla śmiertelników, którego nie dojrzałem w pierwszym momencie.
To jest kod z cyklu "Nie róbcie tego w domu", "Nie pokazujcie tego wykładowcy,bo wygna Cie z zajęć" i "Działa, ale nie musi" oraz parę innych..:D

#include<iostream>
using namespace std;
class Uczen{
private:
    string imie,nazwisko;
    float o1,o2,o3;
public:
    void setImie(){
        cin >> imie;
        this->imie=imie;
    }
    void setNazwisko(){
        cin >> nazwisko;
        this->nazwisko=nazwisko;
    }
    void setO1(){
        cin >> o1;
        this->o1=o1;
    }
    void setO2(){
        cin >> o2;
        this->o2=o2;
    }
    void setO3(){
        cin >> o3;
        this->o3=o3;
    }
    string getImie(){
        return imie;
    }
    string getNazwisko(){
        return nazwisko;
    }
    float getO1(){
        return o1;
    }
    float getO2(){
        return o2;
    }
    float getO3(){
        return o3;
    }
    float srednia(float o1, float o2, float o3){
        return (o1+o2+o3)/3;
    }
    void info(){
        cout << "Imie: " << imie;
        cout << "\nNazwisko: " << nazwisko;
        cout << "\nOceny: " << o1 << " " << o2 << " " << o3 << "\n";
        cout << "\nSrednia: " << srednia(o1,o2,o3) << "\n";
    }
    Uczen(const Uczen & ucz){
        imie=ucz.imie;
        nazwisko=ucz.nazwisko;
        o1=ucz.o1;
        o2=ucz.o2;
        o3=ucz.o3;
    }
};
class Temporary{
private:
   string imie,nazwisko;
    float o1,o2,o3;
public:
    Temporary(string i,string n,float a,float b,float c){
        imie = i;
        nazwisko = n;
        o1 = a;
        o2 = b;
        o3 = c;
    }
};

int main(){
    Temporary tmp("Adam","Koperski",0,1,2);
    Uczen *tmp2;
    tmp2 = new Uczen(*(reinterpret_cast<Uczen*>(&tmp)));
    tmp2->info();
    return 0;
}

Proszę to raczej traktować jako żart, a nie kod..:)

A tak wg. te Twoje setery, to też chyba nie do końca udane.. Poza tym tak jak pisał Flaker..

0

Dzięki wielkie za pomoc, teraz rozumiem swój błąd, co do Twojej wersji kodu to WoW!!! czuję że dużo nauki jeszcze przedemną ;D
Gdybym miał jeszcze jakiś problem to będę pisać.

0
#include<iostream>
using namespace std;
class Uczen{
private:
    string imie,nazwisko;
    float o1,o2,o3;
public:
    Uczen(string imie, string nazwisko, float o1, float o2, float o3) {
        this->imie=imie;
        this->nazwisko=nazwisko;
        this->o1=o1;
        this->o2=o2;
        this->o3=o3;
    }
    Uczen(const Uczen & ucz){
        imie=ucz.imie;
        nazwisko=ucz.nazwisko;
        o1=ucz.o1;
        o2=ucz.o2;
        o3=ucz.o3;
    }
    void setImie(){
        cin >> imie;
    }
    void setImie(int value){
        imie = value;
    }
    void setNazwisko(){
        cin >> nazwisko;
    }
    void setNazwisko(string value){
        nazwisko = value;
    }
    void setO1(){
        cin >> o1;
    }
    void setO1(float value){
        o1 = value;
    }
    void setO2(){
        cin >> o2;
    }
    void setO2(float value){
        o2 = value;
    }
    void setO3(){
        cin >> o3;
    }
    void setO3(float value){
        o3 = value;
    }
    string getImie(){
        return imie;
    }
    string getNazwisko(){
        return nazwisko;
    }
    float getO1(){
        return o1;
    }
    float getO2(){
        return o2;
    }
    float getO3(){
        return o3;
    }
    float srednia(float o1, float o2, float o3){
        return (o1+o2+o3)/3;
    }
    void info(){
        cout << "Imie: " << imie;
        cout << "\nNazwisko: " << nazwisko;
        cout << "\nOceny: " << o1 << " " << o2 << " " << o3 << "\n";
        cout << "\nSrednia: " << srednia(o1,o2,o3) << "\n";
    }
};

int main(){
    Uczen a("AA","AA",1,2,3);
    return 0;
}
0

Doszedłem właśnie do tego, zanim to przeczytałem, ale mam co do tego pytanie do czego służą te powielone settery z value?

0

One są przeładowane..
Możesz je wywoływać tak:

objekt.setO1(3.0);

lub:

objekt.setO1();

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