OOP Problem mit Konstruktor
-
Hallo zusammen ich fummel schon ein paar Tage an meinen ersten OOP rum und es kam zu einen mit völlig unverständlichen Fehler! Vieleicht weiß jemand von den Usern hier wo der Hund begraben liegt?
Also erstmal die .h Datei:[cpp]#ifndef CFaktoren #include <iostream> using namespace std; class CFaktoren { private: double spannung; double temperatur; double prozess; double spannungsFaktor; double temperaturFaktor; double prozessFaktor; void berechneSpannungsFaktor(); void berechneTemperaturFaktor(); void berechneProzessFaktor(); double berechneFaktor(double value, double arry[2], int laenge); double interpolation (double value, double x1, double x2, double y1, double y2); public: CFaktoren(); ~CFaktoren(); void bestimmeFaktoren(); void ausgabeFaktoren(); void getFaktoren(double spannungsFaktor, double temperaturFaktor, double prozessFaktor); #endif CFakroten } und nun die .cpp Datei: #include "CFaktoren.h" void CFaktoren::bestimmeFaktoren(){ cout << "Bitte geben sie 1. die Spannung ein, 2. die Temperatur und 3. den Prozess22" <<endl; }Als Comp.fehlermeldung bekomme ich:
-error C2628: 'CFaktoren' gefolgt von 'void' unzulässig (Semikolon ';'
vergessen?)-error C2556: 'CFaktoren CFaktoren::bestimmeFaktoren(void)': Überladene
Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'void
CFaktoren::bestimmeFaktoren(void)'-error C2371: 'CFaktoren::bestimmeFaktoren': Neudefinition; unterschiedliche
BasistypenMöglich das die Fehler zusammen hängen, aber ich hab kein Plan was ich beim Aufruf des Konstruktors falsch gemacht haben soll?
Danke für die Hilfe
MFG Blade
-
Die Klassendefinition muss mit einem Semikolon abgeschlossen werden. Und was für Körperteile sind Fakroten?
-
Fakroten hab ich anscheind......sollte mal zum Doc. gehen.
Danke für die schnelle Hilfe, ich wuste natürlich das da ein ; hinkommen muss, aber gesehen das das fehlt hab ich nun wirklich nicht.
Danke
-
faktoren.h
#ifndef MeineCFaktoren // sollte nicht den gleichen Bezeichner haben wie die Klasse #define MeineCFaktoren // #include <iostream> brauchst du in deinem Header nicht, also raus damit // using namespace std; sollte besser nie in einem Header stehen class CFaktoren { private: double spannung; double temperatur; double prozess; double spannungsFaktor; double temperaturFaktor; double prozessFaktor; void berechneSpannungsFaktor(); void berechneTemperaturFaktor(); void berechneProzessFaktor(); double berechneFaktor(double value, double *arry, int laenge); double interpolation (double value, double x1, double x2, double y1, double y2); public: CFaktoren(); ~CFaktoren(); void bestimmeFaktoren(); void ausgabeFaktoren(); void getFaktoren(double spannungsFaktor, double temperaturFaktor, double prozessFaktor); }; // Semikolon vergessen #endif // und dies erst am Schlussfaktoren.cpp
#include "faktoren.h" #include <iostream> void CFaktoren::bestimmeFaktoren(){ std::cout << "Bitte geben sie 1. die Spannung ein, 2. die Temperatur und 3. den Prozess22" << std::endl; }
-
Danke für die Tips, eine Frage bleibt noch und zwar wie kann ich die einzelnen Methoden testen ? Im moment ist es ja nur eine Methode aber wie kann ich feststellen ob sie Funktioniert?
MFG
-
Dazu solltest du noch deinen Konstruktor und Destruktor definieren, da diese beim Anlegen bzw. beim Zerstören eines Klassenobjekts automatisch aufgerufen werden. Alternativ kannst du auch einfach den standardmäßig bereitgestellten Konstruktor / Destruktor verwenden, in dem du entweder die entsprechenden Deklarationen aus deinem Header entfernst, oder diese simplerweise auskommentierst:
public: //CFaktoren(); Konstruktor auskommentiert, Standardkonstruktor wird automatisch bereitgestellt, da nun kein Konstruktor mehr angegeben //~CFaktoren(); Destruktor auskommentiert, Standarddestruktor wird automatisch bereitgestellt, da nun kein Destruktor mehr angegebenUnd anschließend schreibst du in deine main-Funktion meinetwegen sowas:
#include "faktoren.h" int main() { CFaktoren faktoren; faktoren.bestimmeFaktoren(); // Aufruf der Memberfunktion }Ruck zuck Kompilieren und dann entweder Ausgabe bewundern oder Fehler analysieren ;).
-
#include "CFaktoren.h" void CFaktoren::bestimmeFaktoren(){ cout << "Test" <<endl; } int main() { CFaktoren test; test.bestimmeFaktoren(); }Ich habe versucht bestimmteFaktoren du def. und die dann mit int main ein Objekt Test von CFaktoren zu erstellen und dort die Methode bestimmteFaktoren aufzurufen.
Leider gibt das diesen Fehler:
public: __thiscall CFaktoren::~CFaktoren(void)" (??1CFaktoren@@QAE@XZ)" in Funktion "_main".
sowie
fatal error LNK1120: 2 nicht aufgelöste externe Verweise
-
blade1982 schrieb:
Ich habe hier nun versucht die Funktion bestimmeFaktoren zu def. aber das geht mal wieder nicht wirklich....
#include "CFaktoren.h"
int main() {
CFaktoren test;
test.bestimmeFaktoren();
{
cout <<"Hallo" <<endl;
}
}
Ich erstelle mit den Konstruktor das Objekt test und rufe von Objekt test die Methode bestimmeFaktoren() auf, da drunter möchte ich dann def. was die Funktion bestimmteFaktoren machen soll.
Habe ich da eine falsche Denkweise?
MFG Blade#include "CFaktoren.h" CFaktoren::~CFaktoren() { ... } CFaktoren::bestimmeFaktoren() { ... } int main() { CFaktoren test; test.bestimmeFaktoren(); }Es ist aber eine ganz schlecht Idee die Präsentationsschicht in eine Klasse der Daten- oder Geschäftslogikschicht zu mischen. Mach lieber eine setFaktoren(....), die Dateneingabe separat und rufe setFaktoren() dann mit den eingegebenen Parametern auf, also so was wie:
#include "CFaktoren.h" CFaktoren::setFaktoren(...) { ... } int main() { CFaktoren test; ... // hier die Eingaben entgegennehmen test.setFaktoren(...); }Und bitte, bitte Code-Tags benutzen!!!!
-
Nun mir ist leider die Klasse so vorgegeben somit wird das nicht zu ändern sein.
Also wenn ich das richtig gesehen habe hast du da den Destruktor eingebaut...
aber warum?Hier nochmal der Code:
#include "CFaktoren.h" CFaktoren::~CFaktoren() { } void CFaktoren::bestimmeFaktoren() { cout << "Test" <<endl; } int main() { CFaktoren test; test.bestimmeFaktoren(); }So oder so bleibt immer noch der Fehler "fatal error LNK1120: 1 nicht aufgelöste externe Verweise." <<Was das auch immer heißen soll<<
außerdem:
CFaktoren(void)" (??0CFaktoren@@QAE@XZ)" in Funktion "_main".
-
blade1982 schrieb:
Nun mir ist leider die Klasse so vorgegeben somit wird das nicht zu ändern sein.
Mein herzliches Beileid!
Also wenn ich das richtig gesehen habe hast du da den Destruktor eingebaut...
aber warum?Weil Du im .h einen deklariert hast, aber weder im .h noch im .cpp einen definiert hast.
Hier nochmal der Code:
#include "CFaktoren.h" CFaktoren::~CFaktoren() { } void CFaktoren::bestimmeFaktoren() { cout << "Test" <<endl; } int main() { CFaktoren test; test.bestimmeFaktoren(); }So oder so bleibt immer noch der Fehler "fatal error LNK1120: 1 nicht aufgelöste externe Verweise." <<Was das auch immer heißen soll<<
außerdem:
CFaktoren(void)" (??0CFaktoren@@QAE@XZ)" in Funktion "_main".Ganz einfach, Du benutzt vermutlich den operator << eines Objektes einer Klasse, für das der operator nicht vorhanden ist. Die zweite Fehlermeldung beim Linken bezieht sich auf den Konstruktor, den Du ebenfalls deklariert, aber nicht definiert hast.
-
blade1982 schrieb:
...
class CFaktoren { ... CFaktoren();...
Den musst Du nicht nur "deklarieren" (= "ankündigen, dass es ihn gibt"), sondern auch "definieren" (= "zeigen, wie er aussieht", auch "Implementation" genannt).
Übrigens: "triviale" Konstruktoren und Destruktoren braucht man nicht zu deklarieren - lass einfach die Deklaration (in der Klasse "CFaktoren();" und "~CFaktoren();") weg. Dann brauchst Du auch keine Definition und der Compiler schenkt Dir den passenden Konstruktor/Destruktor.
Und designtechnisch solltest Du Dir überlegen, ob Du mit einem "defaultkonstruierten Objekt" (also einem, bei dem die Werte nicht sinnvoll gesetzt sind) mit anschließender (manuell aufzurufenden ... und leicht zu vergessenden) "bestimme-"Funktion wirklich gut bedient bist.
Alles, was "bestimme-" kann, kann der Konstruktor auch ...und sogar noch viel mehr.Gruß,
Simon2.
-
Wie schon oben gesagt mit ist diese Klasse mit den Methoden vorgegeben....
Bei den beiden oben genannten Fehlermeldungen bin ich leider immer noch nicht weiter.
Das cout <<....<<endl; ist ja eigentlich möglich über #include <iostream>.
Dieser steht in der .h Datei und die .h Datei ist in meine .cpp Datei ebenfalls includiert mit #include ".....h".
Also sollte da dadran nicht liegen.....MFG Blade
-
...und das "using namespace std;" im .h brauchst Du auch nicht, jedenfalls sehe ich nicht, dass da irgendwas aus diesem namespace benutzt wird. In das .cpp gehört es natürlich rein.
-
blade1982 schrieb:
Wie schon oben gesagt mit ist diese Klasse mit den Methoden vorgegeben...
OK - habe ich überlesen.
(BTW: Über die Frage, ob Kon-/Destruktor "Methoden" sind, wurde hier schon heftig gestritten ... mit der Tendenz zu "nein"
)Aber es bleibt: Wenn Du einen Konstruktor deklarierst, MUSST Du ihn auch definieren (kannst Du so machen wie beim Destruktor) .
Wenn ich das nicht nur übersehen habe, fehlt der .... und das könnte auch zur Fehlermeldung ("Faktoren(void)" (??0CFaktoren@@QAE@XZ)" in Funktion "_main".) passen....Gruß,
Simon2.
-
jencas schrieb:
...und das "using namespace std;" im .h brauchst Du auch nicht, jedenfalls sehe ich nicht, dass da irgendwas aus diesem namespace benutzt wird. In das .cpp gehört es natürlich rein.
Selbst wenn in der Header etwas enthalten wäre, das den Namensraum nutzt sollte man zumindest im Header immer auf ein using namespace verzichten (Dies macht den namensraum global sichtbar und macht Namensräume unsinnig).
cu André
-
asc schrieb:
jencas schrieb:
...und das "using namespace std;" im .h brauchst Du auch nicht, jedenfalls sehe ich nicht, dass da irgendwas aus diesem namespace benutzt wird. In das .cpp gehört es natürlich rein.
Selbst wenn in der Header etwas enthalten wäre, das den Namensraum nutzt sollte man zumindest im Header immer auf ein using namespace verzichten (Dies macht den namensraum global sichtbar und macht Namensräume unsinnig).
cu André
Ja, dies dem TO bei seinem offensichtlich mageren Kenntnisstand auch noch zu vermitteln, habe ich mir (und ihm) erst einmal ersparen wollen.
-
blade1982 schrieb:
public: __thiscall CFaktoren::~CFaktoren(void)" (??1CFaktoren@@QAE@XZ)" in Funktion "_main".
sowie
fatal error LNK1120: 2 nicht aufgelöste externe Verweise
Bedeutung (kurz & knapp): Der in Funktion main (automatisch) aufgerufene Destruktor CFaktoren::~CFaktoren(void) wurde nicht definiert. Die andere von dir gepostete Fehlermeldung ist ähnlich, weswegen ich mir mal das posten der Bedeutung spare. In meinem 2. Post in diesem Thread hatte ich dir eigentlich schon die Lösung für dieses Problem beschrieben:
Mizar schrieb:
Dazu solltest du noch deinen Konstruktor und Destruktor definieren, da diese beim Anlegen bzw. beim Zerstören eines Klassenobjekts automatisch aufgerufen werden. Alternativ kannst du auch einfach den standardmäßig bereitgestellten Konstruktor / Destruktor verwenden, in dem du entweder die entsprechenden Deklarationen aus deinem Header entfernst, oder diese simplerweise auskommentierst:
public: //CFaktoren(); Konstruktor auskommentiert, Standardkonstruktor wird automatisch bereitgestellt, da nun kein Konstruktor mehr angegeben //~CFaktoren(); Destruktor auskommentiert, Standarddestruktor wird automatisch bereitgestellt, da nun kein Destruktor mehr angegebenEdit: Upps, Beitrag (Post) mit Thema (Thread) verwechselt
