Ich habe eine Klasse in einer Extra-Datei definiert dazu noch eine allgemeine Function. Dann eine Header-Datei geschrieben und in meine Hauptdatei eingebunden. Aber irgendwas mache ich völlig falsch. Die allgemeine Funktion ist kein Problem aber bei der Klasse kommt dann " nicht aufgelöstes externes Symbol..". Habe es unten vom Grundprinzip nochmal aufgeschrieben. Woran liegt das Problem ????????
//Test.cpp
#include "stdafx.h"
void Init()
{
MessageBox(NULL,"Algemeine Init","Titel",MB_OK);
}
class App
{
public:
App::App()
{
MessageBox(NULL,"Konstruktor","Titel",MB_OK);
}
App::~App()
{
MessageBox(NULL,"Destruktor","Titel",MB_OK);
}
};
//Test.h
void Init();
class App
{
public:
App();
~App();
};
//Auruf in WinMain
// anwendung.cpp
#include "test.h"
...
...
Init();
App TestObject();
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Nun schau dir an, was du da geschrieben hast!
Du hast einmal die Klasse App in der Test.cpp definiert und dann nochmal in der Test.h!!!
Ja und? Mache das noch nicht solange... Einfach nur class ... ???
Nein du hast die Klasse App einmal in Test.cpp definiert und ein zweites mal in test.h!!!
Jetzt in deiner Anwendung.cpp legst du eine Instanz von App an, nur woher soll der Linker denn nun wissen, welches die gültige Definition von der App Class ist, die in test.cpp oder die test.h?
Klassendefinitionen gehören in die *.h, Klassenimplementationen in *.cpp!
>Ich habe eine Klasse in einer Extra-Datei definiert dazu noch eine
>allgemeine Function.
Nope, du hast eine Klasse doppelt definiert und zwar in zwei Dateien, in Test.cpp steht class App ...bla bla und in Test.h steht dann nochmal class App ...bla bla!
In Test.h definierst du die Klasse App mit ihren public Konstruktor und Destruktor richtiger Weise, aber dann in der Test.cpp wo eigentlich nur die Implementierung des Konstruktors und Destruktors hingehören, schreibst du ja wieder class App ... public... und das ist dort falsch, denn in deiner WinMain() legst du ein neues Objekt von App an und zwar dein TestObject, dieses neue Objekt sucht nun seinen Konstruktor, da du test.h includierst weiß es wie der Konstruktor ausschaut, nämlich App()! Nur diesen Konstruktor kann es (bzw. der Linker) nirgends finden, weil es ihn nicht gibt!
versuch es mal so in der Test.cpp:
//Test.cpp
#include "stdafx.h"
void Init()
{
MessageBox(NULL,"Algemeine Init","Titel",MB_OK);
}
App::App()
{
MessageBox(NULL,"Konstruktor","Titel",MB_OK);
}
App::~App()
{
MessageBox(NULL,"Destruktor","Titel",MB_OK);
}
...
... //restliches Gezumpel
...
Nachtrag:
Was du da gemacht hast, ist natürlich von der Syntax her nicht falsch, man kann sehr wohl auch in einer CPP Datei, eine Klasse definieren und innerhalb der Definiton gleich den Konst./Dest. implementieren, aber du bindest ja in der anwendung.cpp die test.h ein! Anders herum ginge auch die Implementation innerhalb der Headerdatei, dann bräuchtest die test.cpp nicht mehr da deine Klasse ja eh nicht mehr macht als das Objekt zu erstellen um es dann wieder zu vernichten!
Etwas anders beschrieben, hast du folgendes gemacht:
In der Datei test.h sagst du
- da gibt es die Klasse Apfel (= App)
- der kann vom Baum fallen (= Konstruktor)
- danach kann er am Boden vergammeln (= Destruktor)
aber das wie er vom Baum fällt und wie er danach am Boden vergammelt,
das erzählst du in der Datei _nicht_, weil das wahrscheinlich in die test.cpp sollte!
In der Datei test.cpp sagst du aber
- es gibt noch eine Klasse die blöder Weise auch Apfel heißt
- dieser Apfel kann auch vom Baum fallen, aber beim Runterfallen
pfeift er noch ein fröhliches Lied und das geht so... (= MessageBox)
- dieser Apfel kann auch am Boden vergammeln, aber dabei jammert er kläglich (= MessageBox)
Und jetzt kommt's, in der anwendung.cpp sagst du
- ich möchte gerne ein Objekt vom Typ Apfel
- erzeugst dieses Objekt (= App TestObjekt())
- der Linker schaut dumm und will nun dafür sorgen das so ein Apfel ensteht und sucht eine Beschreibung wie der nun aussehen soll, diese
findet er in test.h (also die erste Beschreibung von Apfel) weil du die ja als include mit reingenommen hast
- jetzt wo dieser Apfel fertig ist, will er wie beschrieben vom Baum fallen und dann wie beschrieben vergammeln, weiß aber nicht wie er das machen soll
Der andere Apfel aus test.cpp, ja der wüßte es wie man die beiden Sachen macht, aber der ist ja nicht der, den du in deiner Anwendung erzeugt hast!!!
Und hat es jetzt oben im Brain geschnackelt? ;-))
_Ben Horne_