Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kein passender Konstruktor gefunden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.05.2018, 16:17 Uhr
Getit



Ich habe aus einem Buch folgendes Beispiel zur Vererbung:


C++:
// strom.h
#include <iostream>
#include <string>
using namespace std;
#ifndef __STROM_H__
#define __STROM_H__

class Strom {
    private:
        string quelle;
        unsigned int KWh;
    public:
        Strom():quelle(""),KWh(0) {}
        Strom(string q, unsigned k):quelle(q), KWh(k) {}
        void setQuelle(const string &q) {
            quelle = q;
        }
        void setKWh(unsigned int k) {
            KWh = k;
        }
        string getQuelle() const {
            return quelle;
        }
        unsigned int getKWh() const {
            return KWh;
        }
        void print() const {
            cout << "Stromquelle: " << getQuelle() << endl;
            cout << "KWh: " << getKWh() << endl;
        }
};

#endif




C++:
// atomkraft.h
#include <iostream>
#include <string>
#include "strom.h"
using namespace std;
#ifndef __ATOMKRAFT_H__
#define __ATOMKRAFT_H__

class Atomkraft : public Strom {
    private:
        unsigned int Co2KWh;
        float ct4KWh;
    public:
        Atomkraft(unsigned int co2=0, float ct=0.0, string q="", unsigned int k=0) : Strom(q, k), Co2KWh(co2), ct4KWh(ct) {
            
        };
        unsigned int getCo2KWh() const {
            return Co2KWh;
        }
        float getct4KWh() const {
            return ct4KWh;
        }
        void setCo2KWh(unsigned int co) {
            Co2KWh = co;
        }
        void setct4KWh(float ct) {
            ct4KWh = ct;
        }
        void print() const {
            cout << "Co2 pro KWh : " << getCo2KWh() << endl;
            cout << "Cent pro KWh: " << getct4KWh() << endl;
            Strom::print();
        }
};

#endif



Und die main:

C++:
// main.cpp
#include <iostream>
#include <string>
#include "atomkraft.h"

using namespace std;

int main() {
    Atomkraft meiler1;
    return 0;
}



Also alles unsauber inline definiert im Header.
Das lässt sich kompilieren.

Dann habe ich das Beispiel in .h und .cpp aufgeteilt:

C++:
// strom.h
#include <iostream>
#include <string>

using namespace std;

#ifndef __STROM_H__
#define __STROM_H__

class Strom {
    private:
        string quelle;
        unsigned int kWH;
    public:
        Strom();
        Strom(string, unsigned int);
        void setQuelle(const string&);
        void setKWh(unsigned int);
        string getQuelle() const;
        unsigned int getkWH() const;
        void print() const;
};

#endif



C++:
// strom.cpp
#include <iostream>
#include <string>
#include "strom.h"

using namespace std;

Strom::Strom() : quelle(""), kWH(0) {
    
}

Strom::Strom(string quelle, unsigned int kWH) : quelle(quelle), kWH(kWH) {

}

void Strom::setQuelle(const string &quelle) {
    this->quelle = quelle;
}

void Strom::setKWh(unsigned int kWH) {
    this->kWH = kWH;
}

string Strom::getQuelle() const {
    return this->quelle;
}

unsigned int Strom::getkWH() const {
    return this->kWH;
}

void Strom::print() const {
    cout << "Stromquelle: " << getQuelle() << endl;
    cout << "KWh: " << getkWH() << endl;
}




C++:
// atomkraft.h
#include <iostream>
#include <string>
#include "strom.h"

using namespace std;

#ifndef __ATOMKRAFT_H__
#define __ATOMKRAFT_H__

class Atomkraft : public Strom {
    private:
        unsigned int co2KWh;
        float ct4KWh;
    public:
        Atomkraft(unsigned int, float, string, unsigned int);
        unsigned int getCo2KWh() const;
        float getCt4KWh() const;
        void setCo2KWh(unsigned int);
        void setCt4KWh(float);
        void print() const;
};

#endif



C++:
// atomkraft.cpp
#include <iostream>
#include <string>
#include "atomkraft.h"

using namespace std;

Atomkraft::Atomkraft(unsigned int co2KWh = 0, float ct4KWh = 0.0, string quelle = "", unsigned int kWh = 0) : Strom (quelle, kWh), co2KWh(co2KWh), ct4KWh(ct4KWh) {

}

unsigned int Atomkraft::getCo2KWh() const {
    return this->co2KWh;
}

float Atomkraft::getCt4KWh() const {
    return this->ct4KWh;
}

void Atomkraft::setCo2KWh(unsigned int co2KWh) {
    this->co2KWh = co2KWh;
}

void Atomkraft::setCt4KWh(float ct4KWh) {
    this->ct4KWh = ct4KWh;
}

void Atomkraft::print() const {
    cout << "CO2 pro KWh: " << this->getCo2KWh() << endl;
    cout << "Cent pro KWh: " << this->getCt4KWh() << endl;
    Strom::print();
}



Die main ist die gleiche.

Das lässt sich nicht kompilieren:

Code:
main.cpp: In function ‘int main()’:
main.cpp:9:12: error: no matching function for call to ‘Atomkraft::Atomkraft()’
  Atomkraft meiler1;



Warum wird im ersten Fall ein Konstruktor ohne Argumente (Atomkraft::Atomkraft()) gefunden - wo ist dieser definiert?
Und wieso gehts nach der Aufteilung in .h und .cpp nicht mehr?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.05.2018, 17:24 Uhr
ao

(Operator)


Der Fehler liegt darin, dass der Konstruktor von Atomkraft keine Default-Argumente mehr hat. Hier hat er sie noch:

C++:
class Atomkraft : public Strom {
    private:
        unsigned int Co2KWh;
        float ct4KWh;
    public:
        Atomkraft(unsigned int co2=0, float ct=0.0, string q="", unsigned int k=0) : Strom(q, k), Co2KWh(co2), ct4KWh(ct) {
            
        };

// .....
};



Und hier sind sie weg:

C++:
class Atomkraft : public Strom {
    private:
        unsigned int co2KWh;
        float ct4KWh;
    public:
        Atomkraft(unsigned int, float, string, unsigned int);
// ...
};



Das bedeutet, dass du ein Atomkraft-Objekt nur konstruieren kannst, wenn du alle 4 benötigten Argumente mitgibst.

Es ist übrigens gar nicht so verkehrt, Default-Argumente erst mal gar nicht zu verwenden, also lass die Atomkraft-Klasse ruhig so, wie sie jetzt ist, und pass die main() an. Für Anfänger bringen Defaultargmente nur wenig Vorteile, dafür um so mehr Verwirrung.

Dass du in die Implementierung des Atomkraft-Konstruktor etwas geschrieben hast, was wie Defaultargumente aussieht, ist erstens falsch (an dieser Stelle gibt es keine Default-Argumente, auch die Atomkraft.cpp wird nicht kompilieren) und zweitens für die main.cpp irrelevant.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.05.2018, 17:45 Uhr
Getit



Ich habe meinen Fehler jetzt selber gefunden

1. Die Defaultargumente im Konstruktor von Atomkraft::Atomkraft(unsigned int, float, string, unsigned int)
gehören in die Headerdatei und werden in der Quelldatei weggelassen.

C++:
// atomkraft.h
...
Atomkraft(unsigned int = 0, float = 0.0, string = "", unsigned int = 0);
...



C++:
// atomkraft.cpp
...
Atomkraft::Atomkraft(unsigned int co2KWh, float ct4KWh, string quelle, unsigned int kWh)....
....



2. Fehler:
Ich habe angenommen, dass ein Konstruktor ohne Argumente wirklich 0 Argumente bekommt.
Also:

C++:
Atomkraft::Atomkraft()

und auch ein Konstruktor mit Defaultwerten nicht als Standardkonstruktor gilt. Das war wohl eine falsche Annahme.

Naja, aus Fehlern lernt man (hoffentlich).

Dieser Post wurde am 13.05.2018 um 18:17 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.05.2018, 09:52 Uhr
ao

(Operator)



Zitat von Getit:
Ich habe angenommen, dass ein Konstruktor ohne Argumente wirklich 0 Argumente bekommt ... und auch ein Konstruktor mit Defaultwerten nicht als Standardkonstruktor gilt. Das war wohl eine falsche Annahme.

Naja, aus Fehlern lernt man (hoffentlich).

Bestimmt

Vor allem ist es wichtig, nicht nur die Syntax zu kennen, sondern auch die Bedeutung, die das hat, die sog. Semantik.

Default-Argumente können sinnvoll sein an Stellen, wo es tatsächlich sinnvolle Default-Werte, aber auch andere Alternativen gibt. Das kann man aber nur im Einzelfall entscheiden. Prinzipiell jeden formalen Parameter mit einem Default-Wert zu versehen ist ganz sicher falsch.

Default-Argumente sind fehl am Platz, wenn es keinen herausragenden Wert gibt, der als Defaultwert ausgewählt werden kann, wenn also alle Werte gleich sinnvoll sind. ct4KWH könnte so ein Fall sein: Es gibt keinen sinnvollen Defaultwert für den Kilowattstunden-Preis, sondern wenn man eine Energiequelle anlegt, muss man eben sagen, wieviel die Energie kostet.

Auf der anderen Seite gibt es Klassenmember, die immer auf denselben Wert initialisiert werden, z.B. auf 0. Die sollten überhaupt nicht als formale Parameter im Konstruktor auftauchen, weder mit noch ohne Defaultargument.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: