Aktuelle Zeit: 13.05.2025, 08:36

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Klassen
BeitragVerfasst: 24.02.2009, 11:52 
Offline

Registriert: 10.02.2009, 19:09
Beiträge: 4
Ich hab eine paar Probleme mit Klassen:

Ich habe folgende Dateien in meinem Projekt:
main.cpp - Mainfunktion
global.h - Beinhaltet includes und globale Objektklassen
MyEventReceiver.h und .cpp - Beinhaltet die Klasse MyEventReceiver
functions.h und .cpp - Beinhaltet einige Funktionen

Nun zu den Problemen:

Ich möchte folgende Objekte in global.h haben:
Code:
IrrlichtDevice* device;
IVideoDriver* driver;
ISceneManager* smgr;
IGUIEnvironment* guienv;
rvn::MyEventReceiver rv;


Schreibe ich das so in global.h Bekomme ich vom Visual Studio Compiler folgende Fehler:
Zitat:
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C2653: 'rvn': Keine Klasse oder Namespace
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'rv'
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.


Er findet also weder mein namespace rvn, in dem sich die Klasse MyEventReceiver befindet, noch die Klasse selbst, wenn ich das namespace weglasse (MyEventReceiver.h selbstverständlich included).

Deklariere ich dieses Objekt jedoch in main.cpp funktioniert es.
Wie kann ich das lösen, damit rv global ist?

Dann bekomme ich diese Fehler:
Zitat:
1>main.obj : error LNK2005: "class irr::video::IVideoDriver * driver" (?driver@@3PAVIVideoDriver@video@irr@@A) ist bereits in functions.obj definiert.
1>main.obj : error LNK2005: "class irr::scene::ISceneManager * smgr" (?smgr@@3PAVISceneManager@scene@irr@@A) ist bereits in functions.obj definiert.
1>main.obj : error LNK2005: "class irr::gui::IGUIEnvironment * guienv" (?guienv@@3PAVIGUIEnvironment@gui@irr@@A) ist bereits in functions.obj definiert.
1>main.obj : error LNK2005: "class irr::IrrlichtDevice * device" (?device@@3PAVIrrlichtDevice@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::video::IVideoDriver * driver" (?driver@@3PAVIVideoDriver@video@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::scene::ISceneManager * smgr" (?smgr@@3PAVISceneManager@scene@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::gui::IGUIEnvironment * guienv" (?guienv@@3PAVIGUIEnvironment@gui@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::IrrlichtDevice * device" (?device@@3PAVIrrlichtDevice@irr@@A) ist bereits in functions.obj definiert.
1>E:\C++\Irrlicht\tut\web\Debug\web.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

Was das mit functions zu tun hat weiß ich nicht, da dort keine der Klassen vorkommt.

functions.h:
Code:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include "global.h"

using namespace std;

using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace gui;

bool collision(ISceneNode* one, ISceneNode* two);
void line(int length=80,char character='-');

#endif

functions.cpp:
Code:
#include "functions.h"

bool collision(ISceneNode* one, ISceneNode* two)
{
   return one->getTransformedBoundingBox().intersectsWithBox(two->getTransformedBoundingBox());
}
void line(int length,char character)
{
   for(int i=0;i<length;++i)
      cout<<character;
   if(length!=80)
      cout<<endl;
}

Dieses Problem lässt sich mit einem static vor den Objektdeklarationen lösen, ich verstehe aber nicht wieso.

Sorry für den langen Text :lol:


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit Klassen
BeitragVerfasst: 24.02.2009, 12:57 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo,

Du musst die namespaces mit in global.h packen und vor die weiteren Deklarationen stellen oder global.h erst nach den namespaces inkludieren.

Überprüfe überall, ob die Reihenfolge korrekt ist.

Ich würde die Finger von static sowieso weglassen, stattdessen Singletons verwenden.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit Klassen
BeitragVerfasst: 24.02.2009, 14:08 
Offline

Registriert: 10.02.2009, 19:09
Beiträge: 4
OK, das mit dem namespace hab ich hinbekommen.

Singleton hab ich vorher noch nie gehört :? - da muss ich mich erst mal einarbeiten.

Danke.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit Klassen
BeitragVerfasst: 25.02.2009, 18:23 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hi,

Das wäre sicherlich nicht verkehrt, zumal Singletons ein sehr mächtiges Werkzeug in der OOP darstellen. Singletons sind aber keine festen Bestandteile von C++, sondern lediglich eigene Interplementationen (hoffe, habe das Wor richtig geschrieben).
Zum Beispiel, wenn du Manager-Klassen oder Ähnliches benötigst. (Allgemein: Klassen mit nur einer Instanz pro Laufzeit)

http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit Klassen
BeitragVerfasst: 27.02.2009, 11:24 
Offline
Newsposter
Benutzeravatar

Registriert: 12.03.2007, 10:42
Beiträge: 338
Wohnort: Berlin
@Roman:
um dich zu korrigieren, es hesit Implemantation(en)

Und um nochmal kurz was zu den Singletons fü runserre Anfänger zu schreiben:
Ein Singleton ist eine (ich glaube statische) Template-Klasse mit der man eine Instanz jedes Datentypes erstellen kann(dazu zählen auch eigenne Klassen/Strukturen) um auf diese sozusagen Global zugreifen zu können.

korrigiert mich bitte bezüglich meiner Aussage (hab schon zu lange nichtsmehr mit singletons vor augen gehabt!)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit Klassen
BeitragVerfasst: 28.02.2009, 16:24 
Offline
Benutzeravatar

Registriert: 07.08.2008, 11:31
Beiträge: 104
Hallo Ihr

Zitat:
um dich zu korrigieren, es hesit Implemantation(en)
Das hatte ich befürchtet. :lol: Zuvor habe ich das Wort bei Google eingetippt und sicherzustellen, dass ich es richtig geschrieben habe und ich fand euch das Wort in dieses Form vor. Lacht mich ruhig aus. :lol:

Nochmal zu den Singletons:
Wenn du ein einziges Singleton-Muster haben möchtest, welches die andere Klassen erben sollen, brauchst du aufgrund des statisch gekennzeichneten Objektes darin ein template.

Ein kleines Beispiel dazu:
Code:
template <class T>
   class Singleton
   {
      public:
         static T& getSingleton()
         {
            static T mSingleton;
            return mSingleton;
         }

      protected:
         Singleton() {}

      private:
         Singleton(const Singleton&) {}
         Singleton& operator=(const Singleton&) {}
   } ;


   class App : public Singleton<App>
   {
      friend class Singleton<App>;

      private:
         App() {}

      public:
         void foo() { /*code*/ }
   };

Wir greifen folgendermaßen auf die Klasse App zu:
Code:
int main()
{
     App::getSingleton().foo();
}


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Probleme mit Klassen
BeitragVerfasst: 28.02.2009, 19:25 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
singletons sind imho bullshit.
wenn du wirklich nur eine instanz haben willst machst du eine factory/registry die das sicherstellt.
und singletons machen vererbung scheiße.

btw es heißt implementierung auf deutsch und implementation auf englisch.

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de