Startprobleme in C++ (OOP)



  • Danke für die Schnelle Antwort!! 👍

    Hab da aber noch ein Paar Fragen: 😕

    Aufgabenstellung war:
    Eine Klasse "elektrische Bauteile" schreiben
    Klasse soll folgende Attribute haben:
    Verlustleistung bei 0 Grad, V-Leistung bei 40 Grad und die Temperatur
    Für jedes Attribut soll es Set und Get- Methode geben

    Zu Attribute:

    Ich hab mal nen kleinen Code Erstellt: (Steht in Versuch.h)

    #include <stdio.h>
    
    class elMaschienen;
    
    class elMaschienen
    {
    public:
    	elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    	{
    		VLeistN= VerlLeiitungNullGr;
    		VLeistV= VerlLeistungVierzGr;
    		Temperatur=Temp;
    	}
    
    	void setVLeistN(float VerlLeistungNullGr){VLeistN=VerlLeistungNullGr;}
    	double getVLeistN(void){return VLeistN;}
    
    	void setVLeistV(float VerlLeistungVierzGr){VLeistV= VerlLeistungVierzGr;}
    	double getVLeistV(void){return VLeistV;}
    
    	void setTemperatur(float Temp){Temperatur=Temp;}
    	double getTemperatur(void){return Temperatur;}
    
    private:
    	float VLeistN, VLeistV,Temperatur;
    };
    

    hier sind nun VLeistN, VLeistV, Temperatur meine Attribute oder??

    Würde der Code so funktionieren, oder hab ich was falsch gemacht??



  • CppNeuling schrieb:

    #include <stdio.h> //#include<iostream> stdio.h gehört zu c
    
    class elMaschienen; //das kann weg afaik
    
    class elMaschienen
    {
    public:
    	elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    	{
    		VLeistN= VerlLeiitungNullGr;
    		VLeistV= VerlLeistungVierzGr;
    		Temperatur=Temp;
    	} //Die Definition würde ich in einer .cpp Datei machen
    
    	void setVLeistN(float VerlLeistungNullGr){VLeistN=VerlLeistungNullGr;}
    	double getVLeistN(void){return VLeistN;}
    
    	void setVLeistV(float VerlLeistungVierzGr){VLeistV= VerlLeistungVierzGr;}
    	double getVLeistV(void){return VLeistV;}
    
    	void setTemperatur(float Temp){Temperatur=Temp;}
    	double getTemperatur(void){return Temperatur;}
    
    private:
    	float VLeistN, VLeistV,Temperatur;
    };
    

    hier sind nun VLeistN, VLeistV, Temperatur meine Attribute oder??

    ja



  • CppNeuling schrieb:

    [cpp]
    #include <stdio.h>

    class elMaschienen;

    class elMaschienen // wenn du das in einer kommerziellen Bibliothek machst, wird es ganz schön peinlich 😉
    {
    public:
    elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    {
    VLeistN= VerlLeiitungNullGr;
    VLeistV= VerlLeistungVierzGr;
    Temperatur=Temp;
    } // Initialisierungsliste verwenden!

    void setVLeistN(float VerlLeistungNullGr){VLeistN=VerlLeistungNullGr;}
    double getVLeistN(void){return VLeistN;}

    void setVLeistV(float VerlLeistungVierzGr){VLeistV= VerlLeistungVierzGr;}
    double getVLeistV(void){return VLeistV;}

    void setTemperatur(float Temp){Temperatur=Temp;}
    double getTemperatur(void){return Temperatur;}

    private:
    float VLeistN, VLeistV,Temperatur; // eigentlich sollten die Variablen vor ihrer Benutzung deklariert werden, also weiter nach oben
    };
    [/cpp]

    In diesem Fall würde ich die Klasse eher als Datenstruktur definieren (ja, ich weiß, Strukturen sind Klassen, ich denke aber mehr an die in C gebräuchliche Struktur):

    struct elMaschinen
    {
        float VLeistN, VLeistV, Temperatur;
    
        elMaschinen (leistungN = 0, leistungV = 0, temp = 0)
         : VLeistN (leistungN), VLeistV (leistungV), Temperatur (temp)
        {
        }
    };
    

    An die Kritiker: sind public-Datenelemente hier böser als get- und set-Funktionen, die nichts anderes machen als zuweisen oder zurückliefern?

    Moritz



  • Vielen dank für die Antworten!! 👍

    Dieser Code soll als Übung dienen, um die OOP zu lernen! 💡
    Am ende muss ich mit vielen anderen ein großes Projekt erstellen.
    Ist dafür nicht meine Variante (nicht die Struct- Variante) die Bessere??
    Denn laut der Aufgabenstellung soll es Set und Get- Methoden geben (s.o.).

    class elMaschienen // wenn du das in einer kommerziellen Bibliothek machst, wird es ganz schön peinlich 😉

    Was ist da Falsch?? Muss da ein anderer Name hin oder was?? 😕

    elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    {
    VLeistN= VerlLeiitungNullGr;
    VLeistV= VerlLeistungVierzGr;
    Temperatur=Temp;
    } // Initialisierungsliste verwenden!

    Was ist eine Initialisierungsliste??? 😕
    Wenn ich den diesen Code in ein cpp- file schreib, muss ich doch trotzdem in der Header-datei eine zuweisung machen oder? 😕
    etwa so:

    elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0){}
    

    Oder ist das absoluter Blödsinn??? 😃



  • Maschine schreibt man nicht mit ie, ich denke, darauf wollte er hinaus.
    [cpp]
    struct elMaschinen
    {
    float VLeistN, VLeistV, Temperatur;

    elMaschinen (leistungN = 0, leistungV = 0, temp = 0)
    : VLeistN (leistungN), VLeistV (leistungV), Temperatur (temp) // <-- das ist die Initialisierungsliste
    {
    }
    };
    [/cpp]



  • 😃
    Uuuups, war "mich" gar nicht aufgefallen, naja das "komt" davon "wen" man ständig Strg-C und Strg-V verwendet... grins

    😃
    Aber die anderen Probleme sind nicht vom Pisa- Problem befallen oder???



  • Noch ein paar Fragen:

    1. Was versteht man unter Referenzen??

    Die Aufgabenstellung war folgendermaßen:

    Eine Klasse "elektrische Bauteile" schreiben
    Klasse soll folgende Attribute haben:
    Verlustleistung bei 0 Grad, V-Leistung bei 40 Grad und die Temperatur
    Für jedes Attribut soll es Set und Get- Methode geben

    Hier mein Bisheriger Code:

    #include <iostream.h>
    
    class elMaschinen
    
    {
    private:
    	float VLeistN, VLeistV,Temperatur;
    
    public:
    	elMaschinen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    	{
    		VLeistN= VerlLeistungNullGr;
    		VLeistV= VerlLeistungVierzGr;
    		Temperatur=Temp;
    	}
    
    	void setVLeistN(float VerlLeistungNullGr){VLeistN=VerlLeistungNullGr;}
    	double getVLeistN(void){return VLeistN;}
    
    	void setVLeistV(float VerlLeistungVierzGr){VLeistV= VerlLeistungVierzGr;}
    	double getVLeistV(void){return VLeistV;}
    
    	void setTemperatur(float Temp){Temperatur=Temp;}
    	double getTemperatur(void){return Temperatur;}
    };
    

    2.1.

    elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    {
    VLeistN= VerlLeiitungNullGr;
    VLeistV= VerlLeistungVierzGr;
    Temperatur=Temp;
    } //Die Definition würde ich in einer .cpp Datei machen

    zu //Die Definition würde ich in einer .cpp Datei machen
    elMaschinen muss aber trotzdem noch in der header vorkommen oder??
    Etwa so:
    elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0){}
    oder muss das nicht sein??

    2.2.

    elMaschienen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0)
    {
    VLeistN= VerlLeiitungNullGr;
    VLeistV= VerlLeistungVierzGr;
    Temperatur=Temp;
    } // Initialisierungsliste verwenden!

    Was ist eine Initialisierungsliste und wie verwende ich die??

    Gruß cppNeuling



  • Deine Klasse ist erstmal im Prinzip soweit richtig. In den Header würde ich nur die Schnittstellenbeschreibung rein tun, wofür Headerdateien eigentlich auch nur gedacht sind:

    // Datei: elMaschinen.h
    #pragma once
    
    #ifndef ELMASCHINEN_H
    #define ELMASCHINEN_H
    
    class elMaschinen
    {
    private:
        float VLeistN, VLeistV,Temperatur;
    
    public:
        elMaschinen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0);
    
        void setVLeistN(float VerlLeistungNullGr);
        double getVLeistN(void);
    
        void setVLeistV(float VerlLeistungVierzGr);
        double getVLeistV(void);
    
        void setTemperatur(float Temp);
        double getTemperatur(void);
    };
    
    #endif // ELMASCHINEN_H
    

    Warum includierst du eigentlich immer iostream? Aus iostream benutzt du in der Klasse garnichts.

    Die eigentliche Implementierung gehört in die cpp-Datei (cpp ist auch DIE Implementierungs- bzw. Übersetzungsdatei!):

    // Datei: elMaschinen.cpp
    
    #include "elMaschinen.h"
    
    elMaschinen::elMaschinen(float VerlLeistungNullGr, float VerlLeistungVierzGr, Temp)
    {
      VLeistN= VerlLeistungNullGr;
      VLeistV= VerlLeistungVierzGr;
      Temperatur=Temp;
    }
    
    void elMaschinen::setVLeistN(float VerlLeistungNullGr)
    {
      VLeistN=VerlLeistungNullGr;
    }
    
    double elMaschinen::getVLeistN(void)
    {
      return VLeistN;
    }
    
    // usw.
    


  • Danke für diese ausführliche Antwort 👍 , da wäre aber doch noch was:

    #pragma once
    
    #ifndef ELMASCHINEN_H
    #define ELMASCHINEN_H
    

    Wofür ist das pragma once, und was bewirkt das ifndef ELMASCHINEN bzw das define...???

    2. Was ist eine Referenz??? Habs in der MSDN gesucht, da stehen aber nur irgendwelche verwirrenden bsp's



  • Artchi schrieb:

    // Datei: elMaschinen.h
    #pragma once
    
    #ifndef ELMASCHINEN_H
    #define ELMASCHINEN_H...
    

    rofl 👍
    doppelt gemoppelt hält besser?
    Wenn du das für so wichtig hältst, dan mach es so (nicht jeder Benutzer deiner Lib wird eine MS-Compiler haben und würde sich sonst an den Compilerwarnungen erfreuen müssen):

    #ifdef _MSC_VER
     #if _MSC_VER > 1000
      #pragma once
     #endif
    #endif
    
    #ifndef EL_MASCHINEN_H
    #define EL_MASCHINEN_H
    ...
    #endif
    

    Außerdem:
    [cpp]// Datei: elMaschinen.cpp

    #include "elMaschinen.h"

    elMaschinen::elMaschinen(float VerlLeistungNullGr, float VerlLeistungVierzGr, float Temp)

    : VLeistN (VerlLeistungNullGr), VLeistV (VerlLeistungVierzGr), Temperatur (Temp)
    {
    }[/cpp]Lieber konsequent bleiben 😃

    Moritz



  • Hi(e)lfe???!!!?

    #ifdef _MSC_VER
     #if _MSC_VER > 1000
      #pragma once
     #endif
    #endif
    
    #ifndef EL_MASCHINEN_H
    #define EL_MASCHINEN_H
    ...
    #endif
    

    Hä, schluck, schwitz... 😕 😕 😕
    Das sieht ja noch schlimmer aus als das erste?? 😮
    Gibts dazu vielleicht ne dummen bzw Anfänger- Erklärung (am besten für beides)???

    Ach und noch was --> Was ist ne Referenz????



  • cppNeuling schrieb:

    #ifdef _MSC_VER // wenn Microsoft-Compiler verwendet wird
     #if _MSC_VER > 1000 // wenn Compilerversion > 1000
      #pragma once // Schutz vor mehrfachen Includen; geht AFAIK nur auf MS-Compiler
     #endif
    #endif
    
    #ifndef EL_MASCHINEN_H // ebenfalls Schutz vor mehrfachem Includen (such mal nach "Include-Guards"); konventionelle Art
    #define EL_MASCHINEN_H
    ...
    #endif
    

    Ach und noch was --> Was ist ne Referenz????

    Sieh dir ein C++-Tutorial an (rechts oben auf den [Tutorial]-Link klicken).

    Moritz



  • Ok,ich habs mal soweit fertig, da kommen jetzt aber nen Paar Fehlermeldungen , mit denen ich nicht ganz klar komme:

    -Fehlerm_1: ...elmaschinen.h(17) error C2629: 'class elMaschinen (' unerwartet
    -Fehlerm_2: ...elmaschinen.h(17) error C2238: Unerwartete(s) Token vor ';'
    -Fehlerm_3: ...elmaschinen.cpp(6)error C2511: 'elMaschinen::elMaschinen' : Überladene Member-Funktion
    'void (float,float,float)' nicht in 'elMaschinen' gefunden
    Fehlerm_4: ...elmaschinen.h(28) : error C2092: Funktionen koennen keine Feldelemente sein

    Zu Felerm4:
    Es sollen 10 Verschiedene Bauteile angelegt u. deren Referenzen in einem Feld angelegt werden
    Dabei soll jedes Bauteil Gleiche Werte für verlustleistung und Zufallswerte für Temperat. erhalten.

    Header-Datei

    // Datei: elMaschinen.h
    #ifdef _MSC_VER // wenn Microsoft-Compiler verwendet wird
     #if _MSC_VER > 1000 // wenn Compilerversion > 1000
      #pragma once // Schutz vor mehrfachen Includen; geht nur auf MS-Compiler
     #endif
    #endif
    
    #ifndef EL_MASCHINEN_H // ebenfalls Schutz vor mehrfachem Includen (such mal nach "Include-Guards"); konventionelle Art
    #define EL_MASCHINEN_H 
    
    class elMaschinen
    {
    private:
        float VLeistN, VLeistV, Temperatur;
    
    public:
        void elMaschinen(float VerlLeistungNullGr=0, float VerlLeistungVierzGr=0, Temp=0);//Fehlerm_1,2
    
        void setVLeistN(float VerlLeistungNullGr);
        double getVLeistN(void);
    
        void setVLeistV(float VerlLeistungVierzGr);
        double getVLeistV(void);
    
        void setTemperatur(float Temp);
        double getTemperatur(void);
    
    	int Bauteile[10](float &Leist, float &Temp);//Fehlerm_4
    };
    
    #endif // EL_MASCHINEN_H
    

    cpp-Datei

    // Datei: elMaschinen.cpp
    
    #include "elMaschinen.h"
    
    elMaschinen::elMaschinen(float VerlLeistungNullGr, float VerlLeistungVierzGr, float Temp)//Fehlerm_3
    {
      VLeistN= VerlLeistungNullGr;
      VLeistV= VerlLeistungVierzGr;
      Temperatur=Temp;
    }
    
    void elMaschinen::setVLeistN(float VerlLeistungNullGr)
    {
      VLeistN=VerlLeistungNullGr;
    }
    
    double elMaschinen::getVLeistN(void)
    {
      return VLeistN;
    }
    
    void elMaschinen::setVLeistV(float VerlLeistungVierzGr)
    {
    	VLeistV= VerlLeistungVierzGr;
    }
    
    double elMaschinen::getVLeistV(void);
    {
    	return VLeistN;
    }
    
    void elMaschinen::setTemperatur(float Temp)
    {
    	Temperatur=Temp;
    }
    
    double elMaschinen::getTemperatur(void)
    {
    	return Temperatur;
    }
    


  • int Bauteile[10](float &Leist, float &Temp);//Fehlerm_4
    

    Was willst du damit bezwecken?



  • int Bauteile[10](float &Leist, float &Temp);//Fehlerm_4

    Was willst du damit bezwecken?

    Zu Felerm4:
    Es sollen 10 Verschiedene Bauteile angelegt u. deren Referenzen in einem Feld angelegt werden
    Dabei soll jedes Bauteil Gleiche Werte für verlustleistung und Zufallswerte für Temperat. erhalten.



  • du definierst damit aber eine Methode, die int als returntyp hat und Bauteil[10] heißt und da meckert der Complier, weil Bezeichner keine eckigen Klammern haben dürfen.



  • int Bauteile[10](float &Leist, float &Temp);//Fehlerm_4

    Was willst du damit bezwecken?

    Zu Felerm4:
    Es sollen 10 Verschiedene Bauteile angelegt u. deren Referenzen in einem Feld angelegt werden
    Dabei soll jedes Bauteil Gleiche Werte für verlustleistung und Zufallswerte für Temperat. erhalten.

    Wie mach ich sowas dann???

    PS: Alle anderen Fehler hab ich behoben.



  • ich verstehe nicht wie du das meinst 😕
    Meinst du mit Bauteile ein Objekt deiner Klasse?



  • Hier nochmal meine Aufgabe:

    Aufgabenstellung war:
    Eine Klasse für "elektrische Bauteile" schreiben
    Klasse soll folgende Attribute haben:
    Verlustleistung bei 0 Grad, V-Leistung bei 40 Grad und die Temperatur
    Für jedes Attribut soll es Set und Get- Methode geben
    Es sollen 10 Verschiedene Bauteile angelegt u. deren Referenzen in einem Feld angelegt
    werden Dabei soll jedes Bauteil Gleiche Werte für Verlustleistung und Zufallswerte für
    Temperatur erhalten.

    dann müsste das schon ein Objekt meiner Klasse sein oder???
    Aber wie bring ich cpp jetzt die 10 Bauteile bei????

    So wies ich machen wollte schmeckts cpp nicht 😞



  • elMaschienen bauteile[10]; //Damit legst du 10 Bauteile vom Typ deiner Klasse an
    

Anmelden zum Antworten