Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps



  • TheRealMatix: Guck mal genau, was deine Funktionsdeklarationen im Header und deine Funktionsdefinitionen in der .cpp über den Rückgabetyp der Funktionen sagen :xmas1:



  • Panke schrieb:

    Zur "Signatur" (keine Ahnung, wie das im Fachjargon jetzt genau heißt) ...

    Signatur. :xmas1:

    ThaRealMatix, du musst deine Methoden so definieren wie du sie deklariert hast, sprich int bzw double statt string. Apropos string, verschieb die using-Direktive in die .cpp und nutz std::string im Header.



  • Panke schrieb:

    Zur "Signatur" (keine Ahnung, wie das im Fachjargon jetzt genau heißt) einer Funktion gehört übrigens der Rückgabewert nicht.

    <a href= schrieb:

    wikipedia">Eine Signatur definiert in der Programmierung die formale Schnittstelle einer Funktion. Sie besteht aus dem Namen der Funktion, der Anzahl und Typen ihrer Parameter und dem Typ des Funktionswertes (Rückgabetyp).

    und

    <a href= schrieb:

    wikipedia">Soll eine Methode überladen werden, muss jede Version eine unterschiedliche Signatur besitzen. Dabei wird der Rückgabewert nicht berücksichtigt.



  • ISO-IEC14882:1998 1.3.10 schrieb:

    signature

    the information about a function that participates in overload resolution (13.3): the types of its parameters and, if the function is a class member, the cv-quafiliers (if any) on the function itself and the class in which the member funciton is declared *. The signature of a template function specialization includes the types of its template arguments (14.5.5.1).

    * Function signatures do not include return type, because that does not participate in overload resolution



  • Uhm... wie nu? ich hab sie 2 x als string definiert (diesen Fall hatte ich schonmal und der hat auch funktioniert), dann einmal als int und einmal als double. beides ist auch so in der header datei.

    Sorry aber ich versteh euren hinweis leider nicht, hab wohl n brett vorm kopf?



  • In dem was Du uns gepostet hast, hast Du getQuantity im Header einmal als int deklariert, und im Codefile einmal als string definiert.



  • huh? ich habs doch jeweils als int deklariert?

    invoice.cpp

    Invoice::Invoice( string number, string description, int quantity, double ppi )
    .
    .
    .
    void Invoice::setQuantity( int quantity )
    {
       quantity = quantity;
    }
    
    string Invoice::getQuantity()
    {
       return quantity;
    }
    

    invoice.h

    Invoice ( string, string, int, double );
    .
    .
    .
    .
    int getQuantity();
    

    Ich versteh nicht wo ich es als string definiert haben sollte?



  • Sag mal bist Du blind?

    ThaRealMatix schrieb:

    /* -> */ string /* <- */ Invoice::getQuantity()
    {
       return quantity;
    }
    


  • oops 😞 manchmal sieht man den wald vor lauter bäumen nicht 😞

    Programm läuft nun, aber seltsamerweise gibt das Programm bei der anzahl eine ziemlich große negativ zahl aus (-858993460), obwohl 23 wohl eine Integer Zahl ist oder?

    Invoice invoice1( "123.h3" ,  "Hammer Typ 3", 23 , 12.95);
    


  • Was macht wohl

    void Invoice::setQuantity( int quantity ) 
    { 
       quantity = quantity; 
    }
    

    ???



  • äh ja... wie doof 😞

    Es funktioniert jetzt. Jetzt müsste ich nur noch eine Sache umsetzen, da bin ich aber überfragt ob ich das nun mit ner klassenfunktion umsetzen muss, schätze aber mal ja.

    Wie kann ich nun die pricePerItem und quantity multiplizieren?

    void Invoice::setInvoiceAmount()
    {
    	invoiceAmount= PricePerItem * quantity;
    }
    
    double Invoice::getInvoiceAmount()
    {
       return invoiceAmount;
    }
    

    gehts ja leider nicht 😞

    Sie sind in der header mit

    void setInvoiceAmount (double);
    double getInvoiceAmount();
    

    deklariert.



  • Die set-Methode benötigst du vermutlich gar nicht, da sich der Wert aus den vorhandenen Attributen errechnen lässt (du könntest höchstens den übergebenen Wert faktorisieren und auf Preis und Anzahl verteilen). Und in der get-Methode berechnest du das Produkt und gibst es direkt aus:

    double Invoice::getInvoiceAmmount()
    { return PricePerItem*quantity; }
    

    PS: Übrigens ist es nicht nötig, daß du im Ctor unbedingt über die Setter gehst - der hat auch direkten Zugriff auf die Member-Variablen.



  • many thx... aber mal nebenbei.. was meint ihr mit ctor? irgendwie kann ich mich nicht erinnern den begriff in vorlesung oder buch bereits angetroffen zu haben (ich bin im buch nun aber auch noch nicht soooo weit)



  • Ctor = Constructor = Invoice::Invoice(...)

    (und da es hier auch recht häufig auftaucht - Dtor ist der Destructor)


Anmelden zum Antworten