error c2664 und error c2662 [gelöst - selbst] bitte begründung. ganz kurz



  • hallo.
    ich bin neu hier und hab mal ne frage.

    folgendes.

    es ist eine projektaufgabe.
    keine angst, ihr sollt es nicht proggen 😉 .

    ich hantiere gerade mir einer klasse rum. mit dieser läuft alles super.
    meine getter funktionen laufen auch.

    aber funktionen welche ich selbst erstell habe machen probleme wie
    error c2664 und error c2662.

    error c2664:
    Fehler 1 error C2664: 'datenEingabe': Konvertierung des Parameters 1 von 'const CKondensator' in 'CKondensator &' nicht möglich

    ich deklariere die konstante am anfang. will sie dan hier weiter geben
    datenEingabe(ko);
    da kommt dieser fehler.

    error c2662:
    so sieht der erste prototyp aus:
    void datenAusgabe(const CKondensator ko);

    so der zweite:
    bool inDateiSchreiben(const CKondensator ko);

    lasse ich das schlüsselwort "const" raus, läuft es wunderbar.
    dieses muss aber unbedingt dabei sein.

    ich habe meinen professor gefragt ob es ein fehler sei.
    seine antwort: Schlüsselwort const im Prototypen und (!) bei der
    Implementierung im Parameter angeben! Dann funktioniert es.

    im prototypen ist es ja und auch im funktionskopf nach der main funktion. aber wie ist es gemient wo er schreibt "bei der implementierung im parameter"?

    den teil verstehe ich einfach nicht.
    mit den fehlern kann ich nix anfangen und google half mir bis jetzt nicht weiter.

    für eure hilfe bin ich sehr dankbar.


  • Mod

    Wie sieht Dein Copy-Constuctor aus. Hast Du dort evtl. const vergessen.

    Bei dieser Form muss das Objekt kopiert werden (keine gute Idee, wenn man soweiso const vorsieht.
    Dann kanst Du auch gleich eine Referenz benutzen.



  • Martin Richter schrieb:

    Wie sieht Dein Copy-Constuctor aus. Hast Du dort evtl. const vergessen.

    Bei dieser Form muss das Objekt kopiert werden (keine gute Idee, wenn man soweiso const vorsieht.
    Dann kanst Du auch gleich eine Referenz benutzen.

    Hi.
    Ich weiß gerade nicht was ein copy-constructor ist.
    habe dieses thema neu behandelt und sollen es nun so machen.

    ich habe jetzt eine variable erstellt und die konstante auf die s´kopiert:
    also so: CKondensator kondens = ko; (meine konstante)

    diese wird einer funktion über geben und zwar als call-by-reference.

    jetzt meckert mein compiler nur noch wegen der constante und zwar sagt er:

    Fehler 1 error C2662: 'CKondensator::getKapazitaet': this-Zeiger kann nicht von 'const CKondensator' in 'CKondensator &' konvertiert werden

    also nur noch c2662 fehler.

    der erste ist beseitigt.



  • Zeige mal die ganze Deklaration und Definition von CKondesator.



  • class CKondensator
    {
    private: //kein direkter Zugriff auf Variable
    double kapazitaet;
    string MaterialDielektrikum; // Isolationsmaterial
    double relDielKonst; // s.TAbelle
    string bauform; // Kondesatortyp

    public:
    void setWerte(double kap, double rD, string matDiel, string bf);
    double getKapazitaet(void);
    string getBauform(void);
    double getRelDielKonst(void);
    string getMaterialDielektrikum(void);

    };

    als objekt habe ich in der main stehen

    CKondensator ko;

    meine funktionen in der main funktion.

    Diese funktionen machen ärger. und ich find den fehler einfach nicht.
    void datenAusgabe(ko);
    bool inDateiSchreiben(ko);

    und nach der main.

    Diese gibt nur 1en aus. wenn ich es mit ko mache kommt der fehler: "enthält typqualifiziere, welche nicht mit der memberfunktion kompatibel sind.
    //@param1: Objekt mit den aktuellen Daten
    void datenAusgabe(const CKondensator ko)
    {
    ko.getKapazitaet();
    cout << setw(20) << right << "Kapazitaet[nF]" << setw(15) << right << "Bauform" << endl;
    cout << setw(20) << right << **&CKondensator::**getKapazitaet << setw(15) << right << **&CKondensator::**getBauform << endl << endl;
    cout << setw(20) << right << "rel. DielKonstante" << setw(15) << right << "Material Dielektrikum" << endl;
    cout << setw(20) << right << &CKondensator::getRelDielKonst << setw(15) << right << &CKondensator::getMaterialDielektrikum << endl << endl;
    }//Ausgabe

    Diese gibt nur 1en aus. wenn ich es mit ko mache kommt der fehler: "enthält typqualifiziere, welche nicht mit der memberfunktion kompatibel sind.

    bool inDateiSchreiben(const CKondensator ko)
    {
    bool res = false;
    ofstream ziel; //Datei-Handle
    string dateiName = "Kondensator.txt"; //Dateiname
    ziel.open(dateiName.c_str(), ios::app); //Oeffnen der Datei
    if(ziel) //Erfolgreiches Oeffnen - Abfrage
    {
    res = true;
    ziel << endl << &CKondensator::getBauform << " " << **&CKondensator::**getKapazitaet << " " << &CKondensator::getMaterialDielektrikum << " " << **&CKondensator::**getRelDielKonst << endl;
    }//if
    ziel.close();
    return res;
    }// Datei schreiben



  • also mein problem liegt darin, dass ich die daten nicht ausgeben kann. weder in die datei noch auf die konsole.
    ich möchte sie sozusagen nur auslesen. nix überschreiben.
    die daten werden auch komplett mit dem objekt ko runter in die funktionen gegeben , aber ich bekomme die nicht ausgelesen.

    vielleicht kann mir auch jemand diesen satz erklären:

    Sie müssen das Schlüsselwort const im Prototypen und (!) bei der Implementierung im Parameter angeben!

    der dickgedruckte teil. wie gebe ich das const im parameter an?



  • so leute. ich habs.

    es war so simpel.

    finde ich. und das muss richtig sein, da es ja läuft :).

    eine zeile, je funktion. und zwei stunden da sitzen. aber ---> erfolg 🙂 !

    prototyp: void datenAusgabe(const CKondensator ko);

    constanten dürfen nicht verändert werden.
    also: CKondensator ausKond = ko; //kopie erstellt

    cout << endl << ausKond.getKapazitaet(); <---läuft.

    aber, warum geht es mit der kopie, aber nicht mit dem original "ko" ? nur weil es eine constante ist?


Anmelden zum Antworten