Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps



  • Hallo,

    habe - mal wieder - ein Problem.

    ------ Neues Erstellen gestartet: Projekt: Invoice, Konfiguration: Debug Win32 ------
    Die Zwischen- und Ausgabedateien für das Projekt "Invoice" mit der Konfiguration "Debug|Win32" werden gelöscht.
    Kompilieren...
    invoice.cpp
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(41) : error C2556: 'std::string Invoice::getQuantity(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'int Invoice::getQuantity(void)'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.h(13): Siehe Deklaration von 'Invoice::getQuantity'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(41) : error C2371: 'Invoice::getQuantity': Neudefinition; unterschiedliche Basistypen
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.h(13): Siehe Deklaration von 'Invoice::getQuantity'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(51) : error C2556: 'std::string Invoice::getPricePerItem(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'double Invoice::getPricePerItem(void)'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.h(15): Siehe Deklaration von 'Invoice::getPricePerItem'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(51) : error C2371: 'Invoice::getPricePerItem': Neudefinition; unterschiedliche Basistypen
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.h(15): Siehe Deklaration von 'Invoice::getPricePerItem'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(55) : error C2059: Syntaxfehler: '}'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(55) : error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    d:\eigene dateien\visual studio 2005\projects\programmieren1_praktikum2\invoice\invoice.cpp(55) : error C2059: Syntaxfehler: '}'
    main.cpp
    Code wird generiert...
    Das Buildprotokoll wurde unter "file://d:\Eigene Dateien\Visual Studio 2005\Projects\Programmieren1_Praktikum2\Invoice\Debug\BuildLog.htm" gespeichert.
    Invoice - 7 Fehler, 0 Warnung(en)
    ========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========

    meine invoice.h

    #include <string>
    using std::string;
    
    class Invoice
    {
    public:
       Invoice ( string, string, int, double ); 
       void setPartNumber( string );
       string getPartNumber();
       void setPartDescription ( string );
       string getPartDescription();
       void setQuantity( int );
       int getQuantity();
       void setPricePerItem( double );
       double getPricePerItem();
    private:
       string partNumber;
       string partDescription;
       int quantity;
       double pricePerItem;
    };
    

    meine invoice.cpp

    #include <iostream>
    using std::cout; 
    using std::endl;
    
    #include "invoice.h"
    
    Invoice::Invoice( string number, string description, int quantity, double ppi )
    {
       setPartNumber( number );
       setPartDescription( description );
       setQuantity( quantity );
       setPricePerItem( ppi);
    }
    
    void Invoice::setPartNumber( string number )
    {
       partNumber = number;
    }
    
    string Invoice::getPartNumber()
    {
       return partNumber;
    }
    
    void Invoice::setPartDescription( string description )
    {
       partDescription = description;
    }
    
    string Invoice::getPartDescription()
    {
       return partDescription;
    }
    
    void Invoice::setQuantity( int quantity )
    {
       quantity = quantity;
    }
    
    string Invoice::getQuantity()
    {
       return quantity;
    }
    
    void Invoice::setPricePerItem( double ppi )
    {
       pricePerItem = ppi;
    }
    
    string Invoice::getPricePerItem()
    {
       return pricePerItem;
    }
    
    }
    

    und meine main.cpp

    #include <iostream>
    using std::cout; 
    using std::endl;
    
    #include "invoice.h"
    
    int main()
    {
       Invoice invoice1( "123.h3" ,  "Hammer Typ 3", 23, 12.95);   
    
       cout << "Teilnummer invoice1 ist: " << invoice1.getPartNumber()
    	   <<endl
    	   << "Artikelbeschreibung von invoice1 ist: " << invoice1.getPartDescription()
    	   << "Anzahl invoice1: " << invoice1.getQuantity() 
          << endl
    	  << "Preis pro Stück ist: " << invoice1.getPricePerItem()
    	  <<endl;
    
       return 0;
    }
    

    Ich verstehs nicht, es ist nicht anders, als bei den Strings und da wird nicht gemosert 😕



  • Wo sind denn die überladenen Funktionen definiert?
    Zur "Signatur" (keine Ahnung, wie das im Fachjargon jetzt genau heißt) einer Funktion gehört übrigens der Rückgabewert nicht. Du kannst also nicht zwei identische Funktionen mit unterschiedlichen Rückgabewerten definieren.



  • 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)


Log in to reply