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? |