[C++] Klassen



  • Hallo!

    Edit: Ich entschuldige mich dafür, dass mein Code so lange ist. Ich habe jetzt vesucht ihn so viel wie möglich zu kürzen.

    Im folgenden Code versuche ich drei Klassen zu Erstellen "atom" "molecule" und "material".

    molecule soll friend von atom sein, und material abgeleitet von molecule.

    Die ersten beiden Klassen habe ich erstellt, bei "material" bekomme ich aber kryptische Error Meldungen.

    Ich würde mich über jede Hilfe freuen!

    #include<iostream>
    #include<string>
    #include<fstream>
    #include<cstdio>
    #include<cmath>
    #include<locale>
    #include<iomanip>
    
    using namespace std;
    
    class atom
    {
    	friend class molecule;
    
    	private:
    		string Element;
    		int Ordnungszahl;
    		double Atommasse;
    
    	public:	
    
    		atom(string Name, int Z, double m):Element(Name),Ordnungszahl(Z),Atommasse(m){}
    
    		~atom(){};
    };
    
    class molecule
    {
    	private:
    		atom Atomart_1;
    		atom Atomart_2;
    		string Summenformel;
    		int Anzahl_1, Anzahl_2;
    		char a,b;
    		double M;
    
    	public:
    		molecule(atom E_1, atom E_2, int A_1, int A_2):
    					Atomart_1(E_1), Atomart_2(E_2), Anzahl_1(A_1), Anzahl_2(A_2)
    		{
    			M=Anzahl_1*Atomart_1.Atommasse+Anzahl_2*Atomart_2.Atommasse;
    			char g=Anzahl_1+48;
    			char h=Anzahl_2+48;
    			Summenformel=Atomart_1.Element+g +Atomart_2.Element+ h;
    		};
    
    		~molecule(){};
    };
    
    class material:public molecule
    {
    	private:
    		double Schmelzpunkt, Siedepunkt, Temperatur;
    		string Aggregatzustand;
    		molecule Molecule;
    
    	public:
    		material(molecule Mo, double Smp, double Sdp):
    					Molecule(Mo), Schmelzpunkt(Smp), Siedepunkt(Sdp){}
    
    		void show2()
    		{		
    			cout<<"Der Schmelzpunkt von "<<Molecule<<" liegt bei "<<Schmelzpunkt
    				 <<" K, und der Siedepunkt bei "<<Siedepunkt<<" K." <<endl;
    		};
    
    	~material(){}
    };
    
    int main()
    {
    	atom Wasserstoff("H", 1, 1.00794);
    
    	atom Sauerstoff("O", 8, 15.9994);
    
    	molecule H2O(Wasserstoff, Sauerstoff, 2, 1);
    
    	material Wasser(H2O, 273.15, 373.15);
    	Wasser.show2(); 
    
    	return 0;
    }
    

    Der Kompiler spuckt folgende Error Meldungen aus

    Test.cpp: In constructor ‘material::material(molecule, double, double)’:
    Test.cpp:55: warning: ‘material::Molecule’ will be initialized after
    Test.cpp:53: warning: ‘double material::Schmelzpunkt’
    Test.cpp:58: warning: when initialized here
    Test.cpp:59: error: no matching function for call to ‘molecule::molecule()’
    Test.cpp:38: note: candidates are: molecule::molecule(atom, atom, int, int)
    Test.cpp:28: note: molecule::molecule(const molecule&)
    Test.cpp: In member function ‘void material::show2()’:
    Test.cpp:63: error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)(& std::cout)), ((const char*)"Der Schmelzpunkt von ")) << ((material*)this)->material::Molecule’
    /usr/include/c++/4.2.1/ostream:112: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& ()(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:121: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (
    )(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:131: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& ()(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:169: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:177: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:185: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/bits/ostream.tcc:92: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:196: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/bits/ostream.tcc:106: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:207: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:220: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:228: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:237: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:245: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:253: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/ostream:261: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void
    ) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.2.1/bits/ostream.tcc:120: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]

    Habt ihr vielleicht eine Idee woran das liegen könnte?

    Vielen Dank!



  • Warum wird material von molecule abgeleitet, hat aber auch ein molecule Member? Die molecule Basis wird nur per Defaultkonstruktor initialisiert, den du aber nicht hast.

    In deinem Code ist kein Outputoperator für molecule definiert, Molecule kann in show2 also nicht ausgegeben werden.

    Du willst wohl Wasser.show2 und nicht H2O.



  • Richtig, das habe ich nicht bemerkt.

    Es sollte tatsächlich Wasser.show2() sein!

    Den ersten Teil deines Beitrags verstehe ich leider nicht (ich bin ein Neuling was Programmieren angeht)...

    Könntest du das etwas genauer erklären?



  • Vielleicht solltest du als erstes über die Frage nachdenken und sie beantworten.



  • Ist ein Material ein Molekül oder hat ein Material ein Molekül?



  • Ein Material hat ein Molekül.

    Ich glaube ich habe meinen Fehler verstanden. Danke für eure Hilfe!


Anmelden zum Antworten