Probleme mit dem "->" Operator
-
Ich arbeite derzeit an einem Programm und ich habe ein Problem, der Compiler(VisualStudio .NET 2002) gibt keinen Fehler aus, bzw. er kompiliert alles ohne Probleme, nur beim Ausführen des Programms kommt ein Fehler (Typ unbekannt), d.h. der Debugger von MS erscheint und fragt nach ob er debuggen soll.
Hier ist ein Beispiel vom Code:
**Teil1.h**
#ifndef __TEIL1_H_INCLUDED__ #define __TEIL1_H_INCLUDED__ #include <windows.h> #include "Teil2.h" class CGame { public: CGame(); ~CGame(); void Init(); void CreateScene(); void Run(); private: Teil2 *MyTeil2; }; #endifTeil1.cpp
#include "CGame.h" #include <stdio.h> CGame::CGame(){}; CGame::~CGame(){}; void CGame::Init() { }; void CGame::CreateScene() { //Hier ist ein Beispiel mit dem "->" Operator MyTeil2->setCam(); }; void CGame::Run() { };Teil2.h
#ifndef __TEIL2_H_INCLUDED__ #define __TEIL2_H_INCLUDED__ class CCamera { public: CCamera(); ~CCamera(); virtual void setCam(); virtual void addRotationLookAtAnimator(); virtual void addPitchAnimator(); virtual void addZoomAnimator(); private: }; #endifTeil2.cpp
#include "CCamera.h" CCamera::CCamera() { }; CCamera::~CCamera() { }; void CCamera::setCam() { } void CCamera::addRotationLookAtAnimator() { } void CCamera::addPitchAnimator() { } void CCamera::addZoomAnimator() { }main.cpp
#include <stdio.h> #include "Teil1.h" #ifdef _WIN32 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) #else int main() #endif { CGame *Game; Game->Init(); Game->CreateScene(); Game->Run(); Game->ShutDown(); return 0; }Ich habe die FunKtionen extra leer gelassen, damit nicht soviel Platz eingenommen wird.
Ich weiß das es mit dem "->" operator Probleme gibt, denn wenn ich ihn raus nehme und die Sache anders löse, z.b mit Teil1 MyTeil1, und nicht Teil1 *MyTeil1, muss ich ja den "." Operator nehmen und nicht den "->".∂
-
Mit dem -> Operator gibts kein Problem. Er dereferenziert automatisch deinen Zeiger MyTeil2 und führt dann den Punkt-Operator aus. Macht also automatsich das hier:
(*MyTeil2).Die Sache wird die sein, dass MyTeil2 bei dir noch nirgends hinzeigt. Du musst dem Zeiger erstmal auf ein gültiges MyTeil2 zeigen lassen. Ansonsten zeigt er nämlich ins Niemansland und wenn du dann -> ausführst führst du das im Niemandsland aus. Das wiederrum mag das Betriebssystem nicht und lässt dein Programm eiskalt abstürzen.
MfG SideWinder
-
Wird das nicht hier gemacht?:
Teil2 *MyTeil2; //Hab ich mich verschrieben meine natürlich die Klasse CCamera, also CCamera *Cameraspäter wird das dann so verwendet, bei mir:
Camera->setCam();
Und nicht MyTeil2->setCam();Hab ich mich leider verschrieben
-
Vieleicht hilft das weiter.
Mit dem CLR-Debugger von MS kommt folgender Fehler beim ausführen:System.NullReferenceException
-
ColeZero schrieb:
Wird das nicht hier gemacht?:
Teil2 *MyTeil2; //Hab ich mich verschrieben meine natürlich die Klasse CCamera, also CCamera *Cameradu hast einen zeiger auf einen objekt vom typ Teil2...aber wo ist das passende objekt? Wo zeigt der zeiger hin? wo ist das ziel?
-
Wird das nicht hier gemacht?:
Nein, hier legst du eine Variable vom Typ Zeiger auf CCamera an und keine CCamera. Warum brauchst du überhaupt einen Zeiger, tuts kein normales Objekt?
Camera cam;Tuts das nicht? Wenn nicht, dann Konstruktor:
Camera* cam; ... Game::Game () : cam(new Camera()) // Initialisiere den Zeiger auf cam mit einer neuen Kamera // Damit die auch über die Methoden als Nicht-Member-Variable da bleibt müssen wir sie mit new am Heap anlegen { } Game::~Game () { // Was wir mit new am Heap anlegen muss auch wieder freigegeben werden delete cam; }BTW: Wie du siehst hab ich die ganzen C vor den Klassennamen gekillt, solltest du auch tun.
MfG SideWinder
-
Vielen Dank
Hast recht ich hab die C entfernt, nerven ein wenig..^^
Vorallendingen wenn ich jetzt eine Datei suche,bzw. den Anfangbuchstaben suche, werden nicht gleich alle Dateien angezeigt.
-
Tuts das nicht? Wenn nicht, dann Konstruktor:
C/C++ Code:
Camera* cam;...
Game::Game ()
:
cam(new Camera()) // Initialisiere den Zeiger auf cam mit einer neuen Kamera
// Damit die auch über die Methoden als Nicht-Member-Variable da bleibt müssen wir sie mit new am Heap anlegen
{
}Game::~Game ()
{
// Was wir mit new am Heap anlegen muss auch wieder freigegeben werden
delete cam;
}
C/C++ Code:
Camera* cam;...
Game::Game ()
:
cam(new Camera()) // Initialisiere den Zeiger auf cam mit einer neuen Kamera
// Damit die auch über die Methoden als Nicht-Member-Variable da bleibt müssen wir sie mit new am Heap anlegen
{
}Game::~Game ()
{
// Was wir mit new am Heap anlegen muss auch wieder freigegeben werden
delete cam;
}
C/C++ Code:
Camera* cam;...
Game::Game ()
:
cam(new Camera()) // Initialisiere den Zeiger auf cam mit einer neuen Kamera
// Damit die auch über die Methoden als Nicht-Member-Variable da bleibt müssen wir sie mit new am Heap anlegen
{
}Game::~Game ()
{
// Was wir mit new am Heap anlegen muss auch wieder freigegeben werden
delete cam;
}Funktioniert auch nicht den jetzt meint er bei (new Camera()), dass er keinen geeigneten Standartkonstruktor findet.
p.s nebenbei:
Wenn ich ein normales Object anlege um es z.b in einer Methode einer Klasse zuverwenden, will es aber in einer weiteren Methode der selben Klasse nutzen, muss ich es dann nochmal instanzieren??
Beispiel:
class Test { public: void Hallo(); void Bye(); };[code]
void Test::Hallo()
{
Meet MyMeet;
MyMeet.Treffen();
}void Test::Bye()
{
MyMeet.GoodBye();
//Hier kennt er ja das MyMeet nicht mehr.
}
-
Offenbar hat deine Camera-Klasse verschiedene Konstruktoren, statt () kommt da dann halt eben (vector,vector,vector) oder was auch immer hin. Ein passender Konstruktor halt, so als würdest du das Objekt ganz normal erstellen, da musst du Camera ja auch was übergeben:
Camera cam; // funktioniert ja dann auch nicht, musst ja auch: Camera cam(hier_was_rein); // schreibenMfG SideWinder
-
Oh ja seh ich auch grad ich DEpp

-
So richtig funktionieren tuts immer noch nicht..dann lass ich das eben und erstelle normale Objecte.
DOch da ergibt sich folgendes Problem, welches ich ja mit der eben versuchten Methode nicht ergeben hat.Wenn ich ein normales Object anlege um es z.b in einer Methode einer Klasse zuverwenden, will es aber in einer weiteren Methode der selben Klasse nutzen, muss ich es dann nochmal instanzieren??
Beispiel:
class Test { public: void Hallo(); void Bye(); };void Test::Hallo() { Meet MyMeet; MyMeet.Treffen(); } void Test::Bye() { MyMeet.GoodBye(); //Hier kennt er ja das MyMeet nicht mehr. }
-
Wenn du das machen willst dann muss MyMeet als member in die Klasse.
class Test{ public: void Hallo(); void Bye(); protected: Meet MyMeet; }; void Test::Hallo(){ MyMeet.Treffen(); } void Test::Bye(){ MyMeet.GoodBye(); }Kurt
-
Nimm meinen Rat und ließ dir mal ein gutes Tutorial zum Thema Klassen durch zB hier: http://tutorial.schornboeck.net
oder auch Volkards Tutorial auf http://www.volkard.deMfG SideWinder
-
Wenn du das machen willst dann muss MyMeet als member in die Klasse.
C/C++ Code:
class Test{
public:
void Hallo();
void Bye();
protected:
Meet MyMeet;
};void Test::Hallo(){
MyMeet.Treffen();
}void Test::Bye(){
MyMeet.GoodBye();
}Kurt
Und was ist wenn die Klasse keinen Standartkonstr. verwendet?
Sondern einen parameterabhänigen Eigenkonstr.?
Also z.B.: Meet MyMeet(i,a);
-
Dann würd ichs so machen
class Test{ public: Test() { MyMeet = new Meet( 12, "a" ); } virtual ~Test() { delete MyMeet; } void Hallo(); void Bye(); protected: Meet * MyMeet; }; void Test::Hallo(){ MyMeet->Treffen(); } void Test::Bye(){ MyMeet->GoodBye(); }oder auch
class Test{ public: Test( int x, const char * a ): MyMeet( x, a ){ } Test(): MyMeet( 0, "" ){ } void Hallo(); void Bye(); protected: Meet MyMeet; }; void Test::Hallo(){ MyMeet.Treffen(); } void Test::Bye(){ MyMeet.GoodBye(); }Kurt
-
Dann würd ichs so machen
C/C++ Code:
class Test{
public:
Test() { MyMeet = new Meet( 12, "a" ); }
virtual ~Test() { delete MyMeet; }
void Hallo();
void Bye();
protected:
Meet * MyMeet;
};void Test::Hallo(){
MyMeet->Treffen();
}void Test::Bye(){
MyMeet->GoodBye();
}Führt leider zum absturz des Programms.

-
Cyphy schrieb:
Führt leider zum absturz des Programms.

Wann das so ist dann ist in der Klasse Meet der Wurm drin.
Kurt