Fehlersuche bei Klassen scheitert



  • srand darf nur einmal aufgerufen werden, wie wärs im konstruktor?

    dann kann die methode, die rand benutzt, bei jedem aufruf einen neuen wert kriegen.



  • Eigentlich kann es doch gar nicht mehr an der rand() Funktion liegen wenn
    wie in diesem Code ...

    short int b( short int& as )
    {
    srand(time(NULL));H
    as = 0 + ( rand() % (50-0+1));
    as = as + 8;
    

    as = as + 8 zu keiner Veränderung führt.
    Ich denk mir das des bestimmt an Call by Value liegt ??!! oder nicht.

    H I L F E !!!



  • Die srand(time(NULL)) bringt im Konstruktor nichts. Es wird deshalb auch 2 mal 19 ausgegeben



  • //Ctor
    X() : f(19) , s(19)
    {
        srand(time(NULL));
    };
    
    //Parameter as entfern, wozu war der gut?
    short int b( )
    {
        return ( rand() % 50) + 1;
    }
    


  • int main () 
    { 
        X Y; 
        cout << Y; 
    
        cout <<endl<<endl; 
        system ("pause"); 
        return 0; 
    }
    

    Ist das wirklich deine komplette main Funktion?

    Wenn ja ... wird der Zahlengenerator nie aufgerufen und das Ergebnis 19 ist richtig.

    Du hast 2 mal die Methoden int a() und int b()
    Das erste mal so:

    short int a()  const { return f; }
    short int b() const { return s; }
    

    Das zweite mal mit einer überladung

    short int a( short int af )
    {
        srand(time(NULL));
        af =  ....
        return af;
    }
    short int b( short int& as )
    { 
        srand(time(NULL));
        as =  .....
    
        return as;
    }
    

    Da ich vermute das du die Überladene Funktion in deiner Ausgabe aufrufen
    willst würde ich empfehlen die ersten umzubenennen und die zweiten so
    umzuschreiben das sie nichtmehr nur mit Parametern aufrufbar sind.



  • @ dark-eye erstmal danke. Du hast Recht mit der Überladung denk ich. Hab aber versehentlich bei der Umbenennung des Programms für das Forum einen kleinen Fehler gemacht.

    Wie ruf ich diese Methoden in main auf damit es klappt ?
    Bin erst vor kurzem in das Thema Klasse eingestiegen und mich verwirrt noch einiges. Also bitte auf jeden Fehler aufmerksam machen. Danke

    ###########################
    so etwa in main ??

    int main ()
    {
    X Y;
    
    X *p // Objektpointer erstellen
    p = &Y; // jetzt sollte der Objektpointer auf das erstellte Objekt Y zeigen
    
    p.a; // so oder wie ??
    
    cout << Y;
    

    ##########################
    ++++++++++++++++++++++++++++

    ++++++++++++++++++++++++++++++

    Hier nochmal der komplette Code

    class X {
    private:
    short int f;
    short int s;
    
    public:
    // Konstruktoren
    X() : f(19) , s(19) 
    {  
    srand(time(NULL)); 
    };
    
    // Methoden allgemein
    short int ausgabef() const { return f; }
    short int ausgabes() const { return s; }
    
    void definiere( short int af , short int as )   // die Methode definiere brauch ich dann nicht mehr oder ??
    {
    f = af;
    s = as;
    }
    
    short int a(  )
    {
    
    return rand() %(40-0+1);
    }
    short int b(  )
    {
    
    return rand() % (50-0+1);
    }
    
    friend ostream& operator << ( ostream& os , X& k1 )
    {
    os << "f: " << k1.ausgabef() << " s: " << k1.ausgabes();
    return os;
    }
    
    };
    int main ()
    {
    X Y;
    cout << Y;
    
    cout <<endl<<endl;
    system ("pause");
    return 0;
    }
    


  • Y.a();
    


  • friend ostream& operator << ( ostream& os , X& k1 )
    {
        os << "f: " << k1.ausgabef() << " s: " << k1.ausgabes();
        return os;
    }
    

    Jetzt gibst du wieder die beiden 19er aus

    Um Zufällige Zahlen auszugeben musst du jetzt entweder eine Methode schreiben
    die die Variablen f und s manipuliert.

    oder einfach deine operator<< überladung abändern das diese nun tatsächlich
    die beiden Zufallszahlen ausgibt ... also so ...

    friend ostream& operator << ( ostream& os , X& k1 )
    {
        os << "f: " << k1.a() << " s: " << k1.b();
        return os;
    }
    

    Das ist allerdings noch kein sonderlich gutes Objekt Orientiertes vorgehen.
    Du solltest dich als Hintergrundinformation vielleicht mal mit den
    Grundsätzen von OOP Programmierung beschäftigen.



  • Danke jetzt bekomm ich 2 verschieden Zahlen jedes mal.

    Nun ich hab eigentlich das Buch C++ Breymann. Hab aus dem Buch ungefähr das Schema übernommen. Oder soll ich mir ein anderes zulegen ?



  • Immer langsam ... nicht gleich das Buch verbrennen 😉

    Ich würd mal davon ausgehn das sich der Autor was dabei gedacht hat.
    Ich kenn ja den Kontext nicht.

    Also ruhig weiterlernen und dann aus dem eigenen Wissen heraus entscheiden.



  • kkkk3333 schrieb:

    Danke jetzt bekomm ich 2 verschieden Zahlen jedes mal.

    Nun ich hab eigentlich das Buch C++ Breymann. Hab aus dem Buch ungefähr das Schema übernommen. Oder soll ich mir ein anderes zulegen ?

    Beim Breymann wird der operator<< für eine Rational-Klasse überladen, und da wird alles richtig gemacht und eigentlich auch gut erklärt.


Anmelden zum Antworten