Sie sind nicht angemeldet.

  • Anmelden

1

29.01.2006, 22:39

C++ Problem

Hallo!
Wollte meinen kleinen Code mal ordnen und strukturieren...doch jetzt funktioniert nichts mehr ;\

Es kommen zich Fehler wie

Zitat

error LNK2005: "public: __thiscall myFrameListener::myFrameListener(class Ogre::RenderWindow *,class Ogre::Camera *)" (??0myFrameListener@@QAE@PAVRenderWindow@Ogre@@PAVCamera@2@@Z) bereits in Application.obj definiert

und

Zitat

error LNK2019: Nicht aufgelöstes externes Symbol '"public: void __thiscall ExtendedCamera::instantUpdate(class Ogre::Vector3,class Ogre::Vector3)" (?instantUpdate@ExtendedCamera@@QAEXVVector3@Ogre@@0@Z)', verwiesen in Funktion '"public: virtual bool __thiscall myFrameListener::frameStarted(struct Ogre::FrameEvent const &)" (?frameStarted@myFrameListener@@UAE_NABUFrameEvent@Ogre@@@Z)'

Also die 2005er und 20019er...

Deshalb mal eine grundelegende Verständnisfrage (anderes Wort dafür: N00b-Frage):
Wann muss ich was wo includen?

Mein kleines Testprogramm sieht ca. so aus:

WinMain.cpp - startet alles, übergibt an Application
Application.h/.cpp - erschafft die Szene, danach weiter zu FrameListener
myFrameListener.h/.cpp - baut zuerst eine Camera (ExtendedCamera.h/.cpp) und einen Spieler (Player.h/.cpp), danach steuert es das laufende
ExtendedCamera.h/.cpp - Kamera
Player.h/.cpp - Spieler


Axo fast vergessen: Compiler ist MS Visual C++ .NET (2003)

thx4help, für helfende Links bin ich auch immer sehr offen
XaoMat

2

30.01.2006, 00:33

Du hast die Funktion

ExtendedCamera::instantUpdate(class Ogre::Vector3,class Ogre::Vector3)

in der .h- datei definiert. Aber du hast nirgendwo Code implementiert, was diese Funktionen tun sollen. Kleines Beispiel:

//Datei Foo.h


Quellcode

1
2
3
4
5
6
7
8
#pragma once

class Foo{
  Foo(int a);
  Foo(int a, int b);
  int dataA;
  int dataB;
};


//datei Foo.cpp

Quellcode

1
2
3
4
5
#inlcude "Foo.h"

Foo::Foo(int a){
  dataA=a;
}


Fehlermeldung:
error LNK2019: Nicht aufgelöstes externes Symbol : '__thiscall Foo::Foo(int,int)".... und dann wird es kryptisch... ;)

Lösung:

zusätzlich in der Foo.cpp:

Quellcode

1
2
3
Foo::Foo(int a, int b){
  //whatever...
}


nochma edit:

der erste fehler wird durch das obige "pragma once" verhindert. Da du die .h dauernd irgendwo "includierst" (was auch ok ist) ist der code mehrmals da. Mit pragma once verhinderst du das. Wenn er die .h dann schonmal hatte, ignoriert er sie. Alternativ zu "pragma once"

Quellcode

1
2
3
4
5
6
7
8
#ifndef irgendein_eindeutiger_string
#define irgendein_eindeutiger_string

class Foo{
  //blablub
};

#endif // nicht vergessen ;)

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »kOa_Borgg« (30.01.2006, 00:40)


3

30.01.2006, 00:48

Nochwas:

Du hast 2 Klassen

//classA.h

Quellcode

1
2
3
4
#include "classB.h"
ClassA{
   machIrgendwas(ClassB* b);
};


//classB.h

Quellcode

1
2
3
4
#include "classA.h"
ClassB{
   machIrgendwasAndres(ClassA* b);
};



Dann kommt der Compiler durcheinander, weil du dauernd hin und her includierst.
Lösung:


//classA.h

Quellcode

1
2
3
4
5
class ClassB; //damit definierts du erstmal eine Abstrakte klasse ClassB.

class ClassA{
   machIrgendwas(ClassB* b);
};


//classB.h

Quellcode

1
2
3
4
5
class ClassA; //damit definierts du erstmal eine Abstrakte ClassA .

class ClassB{
   machIrgendwasAndres(ClassA* b);
};


Wichtig: Du darfst in classB.h dann aber NUR Pointer auf ClassA verwenden

Quellcode

1
2
3
4
5
6
7
8
9
10
class ClassB{
   machIrgendwasAndres(ClassA* b);
  
   ClassA* blablub; //<- Okay


  /*Folgendes ibt nen Fehler, weil er damit implizit den constructor aufrufen   muss den er noch nicht kennt*/
  ClassA   blablub; 

};

4

30.01.2006, 11:32

hm, früher war ich c++ Fan aber mittlerweile hab ich mich in Java verliebt :love:

das is einfach viel übersichtlicher und cooler

und diese scheiss Zeigerarithmetik hat man auchnicht mehr

5

30.01.2006, 11:43

Ich möchte sie nicht missen die Pointer. Bei Java weiß man nie, was man da wirklich vor sich hat. Ist es eine Referenz oder doch das "original"? Furchtbar! Abgesehen davon lahm ohne ende. Für GUI und Datanbankkram ist das relativ egal. Sowie du an zeitkritische Dinge heran gehst ist Java nicht die Wahl. Trotz alledem würde ich immer einem Anfänger Java anstatt c/c++ empfehlen.

6

02.02.2006, 14:48

Vielen Dank erstmal Borgg! Scheinst dich ja mit der Materie auszukennen :)

ich habe jetzt die ifndefs eingefügt, komisch, dass ich das noch nirgendwo gelesen habe....kannst du mir ein paar gute c++ seiten empfehlen?

nun sind zwar die compilefehler nicht aber die Verknüpfungsfehler gelöst....

Zitat


Code wird generiert...
Verknüpfen...
Application.obj : error LNK2019: Nicht aufgelöstes externes Symbol...

Liegt die Lösung in deinem 2. Post? Den habe ich nämlich nicht verstanden :rolleyes:

7

02.02.2006, 19:17

Wenn du in der .h Datei eine Funktion eines Objektes "Anmeldest" bzw "definierst"

Datei class Foo.h

class Foo{
meineFunktion1();
meineFunktion2();
meineFunktion3();
}

Dann musst du in der dazugheörigen .cpp Datei auch definieren, wass diese funktion machen soll. sonst meckert er!

Datei class Foo.cpp

Foo::meineFunktion1(){
//was auch immer die funktion tut...
}

Foo::meineFunktion2(){
//was auch immer die funktion tut...
}

Foo::meineFunktion3(){
//was auch immer die funktion tut...
}

Falls das nicht weiter hilft, mach mal ne Zip Datei von dem Projekt. Ich Check das dann mal... berichtige es und schreib die Kommentare an die stellen, wo ich was geändert hab ;)


Zur Buchempfehlung:
"Empfehlen" kann ich dir leider nix. Ich habe mal während des Zivi vor mitterweile 6 Jahren das Buch "Borland C++5 in 24 Tagen" durchgeackert. Da hab ich mir quasi die Grundlangen angeeignet. Der rest war während des Studiums einfach : "learning by doing". Grundsätzlich: wenn du einfach nur ohne Ziel die Sprache lernen willst ist es schwer. Du musst ein Ziel haben, was du programmieren willst. Das ist wichtig für die selbstmotivation. Bei mir wurden die Ziele wärend des Studiums und durch HiWi-Job an der Uni automatisch vorgegeben. Bei Problemen hilft oft google weiter. Dein Linker fehler ist ein "klassisches" Problem. Da hättest du sicher was gefunden. Ansonsten halt in Foren fragen. Allerdings wäre ich da vorsichtig ohne vorher gegoogelt zu haben, da reagieren die oft allergisch, wenn du mit fragen kommst, die dir google sehr leicht beantworten könnte. (Mir is das schnuppe frag ruhig ;) )

8

02.02.2006, 21:45

Zitat

Original von kOa_Borgg
Ich möchte sie nicht missen die Pointer. Bei Java weiß man nie, was man da wirklich vor sich hat. Ist es eine Referenz oder doch das "original"? Furchtbar! Abgesehen davon lahm ohne ende. Für GUI und Datanbankkram ist das relativ egal. Sowie du an zeitkritische Dinge heran gehst ist Java nicht die Wahl. Trotz alledem würde ich immer einem Anfänger Java anstatt c/c++ empfehlen.


Bei objekten hat man immer Referenzen, ist imho viel eindeutiger...



Nächstes Semester haben wir dann sehr ausführlich c++, bin mal gespannt.

Es ist klar dass für zeit und Ressourcenkritische Sachen eher c++ oder gar reines c in frage kommt, aber Java ist zum lernen Prima

9

02.02.2006, 21:47

Ich kann folgendes Buch empfehlen:

c++ lernen und professionell anwenden

von peter prinz und ulla kirch-prinz


das Buch is so klasse, da versteht man alles, auf der linken seite immer beispiel auf der rechten seite der Text

das Buch is der Hammer, da versteht man selbst die schwierigsten Themen :)

10

02.02.2006, 22:17

argl....!"§!()!"§$!....
ich bin jetzt jede Zeile von dem Code durchgegangen bis mir die Augen schmerzten...habe aber nix "anstößiges" gefunden....obwohl ich ja doch das Gefühl habe, dass es irgendso ein Newbie (<-ich) -Fehler ist.
Vllt kannsts ja mal durchschauen, vielen Dank schonmal für die Geduld...findet man wie du schon sagtest nicht oft in so 1337-pr0gr4mm0r-foren ;)

Danke dir auch Max, habe das Buch schon öfters gehört...werde es wohl kaufen, wenn ich wieder flüssig bin :D

Xao

PS: Wie du schon sagtest, lernt man nur was wenn man ein projekt hat...das ist so ein "Lernprojekt"...habe mit Netzwerksachen angefangen (Raknet) und dachte, wäre doch cool so ein paar 3D Modelle rumfahren zu lassen....das es so schwer ist... :D
»XaoMat« hat folgende Datei angehängt:
  • Game1.rar (288,07 kB - 55 mal heruntergeladen - zuletzt: 02.02.2024, 21:39)

11

02.02.2006, 23:21

Es fehlt die Datei "ExampleApplication.h". Die musst du mir schon schicken ;) Sonst compiliert der das nicht bei mir...

edit: da fehlt irgendwie ne ganze Menge. Wo ist z.B. der Typ SceneNode definiert, den du in player.h verwendest?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kOa_Borgg« (02.02.2006, 23:25)


12

02.02.2006, 23:29

Zitat

Original von kOa_Borgg
Es fehlt die Datei "ExampleApplication.h". Die musst du mir schon schicken ;) Sonst compiliert der das nicht bei mir...

edit: da fehlt irgendwie ne ganze Menge. Wo ist z.B. der Typ SceneNode definiert, den du in player.h verwendest?



nochma edit:
Habe das so ein $(OGRE_HOME) in deinem Projekt gefunden bei Include-Pfaden.
Nutzt du zufällig irgendeine zusätzliche Library? Dann musst du die auch im Projekt angeben zum linken...

Project -> Properties -> ConfigurationProperties -> Linker -> Input -> AdditionalDependencies -> und da dann halt die Lib eintragen.

Einfach den Namen der .lib Datei mit Pfadangabe davor.

13

02.02.2006, 23:33

Zitat

Original von MaxPower
Bei objekten hat man immer Referenzen, ist imho viel eindeutiger...

Gabs da keine "ByVal" option? Oder verwechsel ich da jetzt was?


Zitat

Original von MaxPower
Nächstes Semester haben wir dann sehr ausführlich c++, bin mal gespannt.

Verleitet oft zu Quick and dirty. Allerdings ist mal bei Java leider oft zu umständlichen Kapriolen gezwungen die man bei c/c++ mal eben schnell umschiffen kann.

Zitat

Original von MaxPower
Es ist klar dass für zeit und Ressourcenkritische Sachen eher c++ oder gar reines c in frage kommt

Naja wenn es dann richtig um die Wurst geht nimmt man gleich Fortran. C ist na nun wirklich out.

14

03.02.2006, 12:24

Wenn schon, dann Assembler :D

Edit: In Java is mir bis jetzt nur Call by Value bekannt, d.h. wenn man eine Referenz übergibt erzeugt Java eine Lokale Kopie.

Macht das ystem natürlich nicht gerade schnell :rolleyes:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MaxPower« (03.02.2006, 12:25)


15

03.02.2006, 12:32

Zitat

Original von kOa_Borgg
....
edit: da fehlt irgendwie ne ganze Menge. Wo ist z.B. der Typ SceneNode definiert, den du in player.h verwendest?

hm..klar fehlt da viel, da ich die Ogre libs verwende....
soll ich dir einfach mal den ganzen ordner hochladen? sind dann aber so 15mb...ich dachte nur vllt findest gleich den fehler...

Das komische ist ja, dass es funktioniert hat bevor ich den code "ordnen" wollte :D also richtig gelinkt etc. müsste es schon sein...

Xao

16

03.02.2006, 13:52

Na is quatsch. Dann lad ich mir die mal runter. Komm ich aber erst heute abend zu. Ich meld mich dann.

17

03.02.2006, 15:23

geht hier zwar nicht um java aber ich find java auch toll ^^
und wenns wirklich ressourcen und zeitkritisch sein muss gibts immer noch good old PowerBASIC (alte liebe rostet nicht ^^)