Startprobleme in C++ (OOP)
-
Hallo, bin total neu hier,
hoffe mir kann jemand bei der OOP helfen?!?
1. Kann mir jemand sagen was Attribute und Methoden in Cpp sind??
2.Ich hab mir über Einfügen--> Neue Klasse eine klasse eingefügt und die hat jetzt ziemlich viel Code erstellt, den ich nicht ganz verstehe??// elBauteilDGH.h: Schnittstelle für die Klasse elBauteilDGH. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_ELBAUTEILDGH_H__F8E40660_2186_43B1_B076_8ECAE6947A5B__INCLUDED_)//?????? #define AFX_ELBAUTEILDGH_H__F8E40660_2186_43B1_B076_8ECAE6947A5B__INCLUDED_//??????? #if _MSC_VER > 1000//????????? #pragma once//?????????????? #endif // _MSC_VER > 1000//??????????? class elBauteilDGH { public: elBauteilDGH(); virtual ~elBauteilDGH();//??????????? }; #endif // !defined(AFX_ELBAUTEILDGH_H__F8E40660_2186_43B1_B076_8ECAE6947A5B__INCLUDED_)
3. Ich muss eine Klasse Erstellen namens elBauteil --> sowit habs ich ja schon, oder??
in diese Klasse soll ich jetzt 3 Attribute einfügen
-> Verlustleistung bei 0 Grad und Verlustleistung bei 40 Grad und die Temperatur
wo muss ich das einfügen???4. Get-Set Methoden gehören in die header datei oder??
Kann mir da jemand helfen???
PS: Habe bereits Programmierkenntnisse in VB/VBA(Hobbyprogrammierung)
-
1. Erstmal kurz und prägnant gesagt:
Methoden sind einfach nur Funktionen die zu einer Klasse gehören.
Attribute sind Variablen die zu einer Klasse gehören.2. Dieser verwirrende Code ist für einen Anfänger tatsächlich verwirrend. Deshalb solltest du auch nicht mit Assistenten der IDE arbeiten, sondern lieber selber alles selber machen.
Alles was ein #-Zeichen am Anfang hat, nennt sich Makro und hat eigentlich mit C++ nichts zu tun. Die sind nur für den Präprozessor gut. Du solltest dich mit den wichtigsten Makrobefehlen auch beschäftigen, dann weißt du, was sie bedeuten.
-
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 gebenZu 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 gebenHier 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 machenzu //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 bleibenMoritz
-
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 seinZu 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