Klasy błąd

CR
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
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:

Kopiuj
#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!


"Najwyższym osiągnieciem jest pokonac wroga bez walki" Sun Tzu
edytowany 1x, ostatnio: Creeative
Flaker
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 5 lat
  • Postów:98
0

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

KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
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

Flaker
Akurat jeden konstruktor dla śmiertelnikow jest w kodzie "Uczen(string imie, string nazwisko, float o1, float o2, float o3)", ale fakt, ciężko go zauważyć, łamania linii przydałyby się troszkę częściej ;)
KO
aha, ok sorki, nie zauważyłem, ale jakby go nie było, to nawet nie wpadłbym sam na pomysł napisania takiego kodu:)
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
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

Kopiuj
#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..

edytowany 3x, ostatnio: kopernik
CR
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
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ć.


"Najwyższym osiągnieciem jest pokonac wroga bez walki" Sun Tzu
edytowany 1x, ostatnio: Creeative
KO
ale nie stosuj raczej nigdzie tego kodu, bo on na prawdę nie ma gwarancji działania.. Po prostu wywołuj konstruktor przy tworzeniu obiektu.. To jest raczej takie pokazanie na siłę, że coś się da zrobić..
Flaker
Powyższy karkołomny kod nie ma powodu nie działać :) Dopóki obie klasy mają zachowaną taką samą strukturę, i nic nagle nie znika ze stosu/sterty to jest jak najbardziej ok. Zdecydowanie jednak użycie konstruktora z argumentami powinno być jedynym i słusznym rozwiązaniem. Póki tylko zależy nam na czymś konkretnym, a nie bawieniu się formą ;)
KO
A właśnie to zależy od standardu, w którymś wiem, że nie ma 100% gwarancji.. To miał być z samego założenia dziwak:)
Flaker
To bardzo chętnie poznam dlaczego miałoby się takie rozwiązanie sypać :) notabene, można minimalnie dziwaka oddziwnić, pozbywając się wskaźników i dynamicznej alokacji :)
KO
http://4programmers.net/Forum/C_i_C++/190928-definicja_metody Tu miałem burzliwą dyskusję z Endrju na ten temat.. Sam byłem tego zdania co Ty:)
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
0
Kopiuj
#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;
}
edytowany 1x, ostatnio: kopernik
CR
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
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?


"Najwyższym osiągnieciem jest pokonac wroga bez walki" Sun Tzu
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 2 lata
  • Postów:519
0

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

Kopiuj
objekt.setO1(3.0);

lub:

Kopiuj
objekt.setO1();

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.