Prüfung zweier Nummern



  • Bei der folgenden Übung muss man eine klasse Book schreiben, was auch gemacht wurde. Jetzt bin muss man sie zwei Nummern (ISBN) der zwei Bücher mit dem ==-Operator testen ob sie identisch sind. Und da sagt der Compiler dass void mit Typen nicht zulässig sind. Wenn ich aber nichts reinschreibe in die klammern dann sagt der Compiler Funktion akzeptiert keine 0 Argumente.

    bool operator==(Book& New, Book& New3)
    {
    	return New.ISBN(45,'-',78,'-',89,'-',0)==New3.ISBN(45,'-',45,'-',56,'-',0);
    }
    
    bool operator!=(Book& New, Book& New3)
    {
    	return!(New==New3);
    }
    


  • Warum machst du da überhaupt Klammern hin? Was ist denn Book::ISBN?



  • Also Book ist der Name der klasse. Und man musste eine ISBN Nummer ausdenke für die Übung. Und wie ich sehe das die ISBN darum in der Übung war damit man das mit dem ==-Operator vergleichen kann.



  • Was ist Book::ISBN? Ist das eine Methode oder eine Membervariable oder was?



  • Was macht die Funktion Book::ISBN (Besser was ist ISBN (TYP)?)? Welche Parameter nimmt diese an? Warum speicherst du die ISBN-Nummer nicht als String?

    Ps: New und New3 sind merkwürdige Bezeichner.



  • So hier ist der gesamte Code. Vielleicht ist ein hässlicher Code. Bei ISBN wurden int und char genommen um eine Überprüfung ob es gültige Werte haben.

    #include "std_lib_facilities.h"
    
    class Book
    {
    public:
    	void ISBN(int a, char h, int b, char e, int c, char f, int d);
    	void Titel(string name);
    	void Autor(string name, string vorname);
    	void Copyright(string name);
    	void liehen(string name, string name2, string antwort);
    	void geben(string name, string name2, string antwort, int a);
    	Book(string name, string name2);
    private:
    	int a,b,c,d;
    	string name, name2, vorname,antwort;
    	char h,e,f;
    };
    
    Book::Book(string n, string n2):name(n),name2(n2)
    {
    	if (n != n2) {
    		cout << n << " " << n2 << endl;} 
    	else {
    		cout << "Ungueltiger name!" << endl;}
    }
    
    void Book::liehen(string n, string n2, string an)
    {
    	if (an == "ja" || an == "Ja") {
    		cout << n << " " << n2 << " " << "ist ausgeliehen?" << " " << an << endl;}
    	else {
    		cout << "Das Buch sollte ausgeliehen sein!" << endl;}
    }
    
    void Book::geben(string n, string n2, string an, int aa)
    {
    	if (an != "Montag " && an != "Dienstag" && an != "Mittwoch" && an != "Donnerstag" && an != "Freitag" && aa > 31) {
    		cout << "Das ausgeliehen buch" <<  " "  << "\"" << n << " " << n2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
    	else {
    		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
    }
    
    void Book::ISBN(int aa, char hh, int bb, char ee, int cc, char ff, int dd)
    {
    	if ( aa < 0 || hh != '-' || bb < 0 || ee != '-' || cc < 0 || ff != '-' || dd != 0) {
    		cout << "Sorry das ist keine ISBN!" << endl;}
    	else {
    		cout << aa << hh << bb << ee << cc << ff << dd << endl;}
    
    }
    
    bool operator==(Book& New, Book& New3)
    {
    	return New.ISBN(45,'-',78,'-',89,'-',0)==New3.ISBN(45,'-',45,'-',56,'-',0);
    }
    
    bool operator!=(Book& New, Book& New3)
    {
    	return!(New==New3);
    }
    
    void f()
    {
    	Book New("Das","Buch");
    	Book New2("Das","Das");
    	Book New3("Buch","Drei");
    	Book Test("Neues","Buch");
    	New.liehen("Das","Buch","Ja");
    	New2.liehen("Ein","Buch","Nein");
    	New.geben("Das","Buch","Montag",15);
    	New2.geben("Ein","Buch","Samstag",30);
    	Test.geben("Neues","Buch","Montag",56);
    	New.ISBN(45,'-',78,'-',89,'-',0);
    	New2.ISBN(96,'-',89,'-',88,'-',12);
    	New3.ISBN(45,'-',45,'-',56,'-',0);
    	Test.ISBN(45,'+',45,'-',45,'-',0);
    }
    
    int main()
    {
        f();
    
    	keep_window_open();
        return 0;
    }
    


  • Und wo wird deine ISBN nun gespeichert, damit du diese Werte im == operator aufrufen kannst? Bislang sehe ich da nichts. Du versuchst gerade den Rückgabewert zweier Funktionen (void) miteinander zu vergleichen, das geht natürlich nicht.



  • Also das ist das Problem. Sollte man das in einem Vector werfen? Oder eine Funktion schreiben?



  • Du kannst das Ganze in einen String packen oder in die Variablen int a b c d die du dafür angelegt, aber nie verwendet hast. char h e f brauchst du da aber auch nicht, da ja klar sein sollte wo der Bindestrich dann ist. Wenn du die Werte gespeichtert hast, musst du diese nur vergleichen in dem operator.



  • OK versuche mal etwas zu machen.



  • Aber eins verstehe ich nicht. Die Zahlen sind ja im ISBN. Wieso wird das nicht erkannt?



  • Das sind doch nur lokale Variablen die beim Ende der Funktion freigegeben werden. Siehe dafür die Themen "Scope" und "Gültigkeiten von Variablen".

    Die ISBN-Funktion müsste eher so aussehen:

    void Book::ISBN(int aa, char hh, int bb, char ee, int cc, char ff, int dd) 
    { 
        if ( aa < 0 || hh != '-' || bb < 0 || ee != '-' || cc < 0 || ff != '-' || dd != 0) { 
            cout << "Sorry das ist keine ISBN!" << endl;} 
        else { 
            cout << aa << hh << bb << ee << cc << ff << dd << endl;
    a = aa; b = bb; c = cc; d = dd; // Variablen in der Klasse speichern} 
    
    }
    

    Und dann fragt der Operator diese Variablen ab und vergleicht diese.

    bool operator==(const Book& lhs, const Book& rhs) 
    { 
        return (lhs.a == rhs.a && lhs.b == rhs.b && lhs.c == rhs.c && lhs.d == rhs.d); 
    }
    

    Wenn die Variablen private sind, dann muss der Operator friend sein, oder du musst getter-methoden verwenden.



  • Danke für den Tipp. Werde am Programm morgen weiter arbeiten.



  • Da int a,b,c,d private sind habe ich ein int a2,b2,c2,d2 bei public gesetzt. Vielleicht ist das nicht in Ordnung aber beim Buch von aus ich lernen habe ich diesen bool operator zum ersten Mal gesehen. Dieser bool operator überprüft das die zwei Nummer gleich sind, kann man da auch etwas ausgeben lassen?



  • ja, schreib dein count rein

    greetz KN4CK3R



  • OK und wieder was gelernt.



  • Wie will der <<operator den Wert von New.Autor2() ausgeben obwohl es so geschrieben wurde das es sollte.

    string Autor2(){return autor;}
    
    ostream& operator<<(ostream& os, Book& New)
    {
    	return os << New.Titel2() << " " << New.Titel3() << "\n"
    	          << New.Autor2() << endl;
    }
    


  • winux schrieb:

    Wie will der <<operator den Wert von New.Autor2() ausgeben obwohl es so geschrieben wurde das es sollte.

    Ich verstehe nur Bahnhof. Versuch bitte dich klar, präzise und vor allem verständlich auszudrücken.



  • und was ist jetzt deine Frage?

    greetz KN4CK3R



  • Also laut der Übung soll man mit dem <<operator den Titel, Autor und ISBN auf jeweils getrennte Zeilen ausgeben. Da aber die int und string private sind habe ich eine Funktion geschrieben die diese Werte zurückgreifen. Und das Problem ist folgendes, ich habe die Funktion geschrieben das auf die private Variablen zurückgreifen kann. Aber irgendwie will der <<operator sie nicht asugeben.


Anmelden zum Antworten