Fehlermeldung bei einem Pointer als "Variable"
-
Hi Leute !
Ich bin der Zeit mit einem Projekt beschäftigt in dem ich 2 Klassen habe, die jeweils einen Pointer als private Variable aufeinander haben.Class ClassA { . . . ClassB *pClassB //Dieser Pointer wird später verwendet um ein Array von Objekten anzulegen . . . }; Class ClassB { . . . ClassA *pClassA //Dieser Pointer soll als Referenz verwendet werden um nötige Daten aus dem Objekt zu holen . . . };So ich arbeite mit dem DEV CPP und da erhalte ich folgende Fehlermeldung:
ISO C++ forbids declaration of ClassA with no type
und wenn ich aus dem Pointer eine normale Variable machen lautet die Fehlermeldung:
ClassA does't name a type
Also die Headerdatei von ClassA ist eingebunden. Okay ich könnte mir vorstellen das dies ein Sicherheitsmechanismus ist weil ich ja sonst von einem Objekt der ClassB auf sich selbst zu greifen könnte also ungefähr so:
ObjClassB.pClassA->pClassB->tueIrgendetwas();Oder gibt es irgendwie eine Lösung wie ich das trotzdem realisieren kann ?
-
ObjClassB.pClassA->pClassB->tueIrgendetwas();Geht doch gar nicht, pClassA ist doch private.
-
Okay da haste recht
Aber würde sich ja auf public ändern lassen.
Aber wie gesagt der Compiler will die ClassB erst gar nicht compilieren
Eben auf den Grund der Fehlermeldung. Das letztere war ja nur eine Vermutung warum sowas von C++ erst gar nicht unterstütz wird.
-
Dann zeig doch einfach mal den (relevanten) Code.
Und benutz lieber cpp-Tags.
-
So das wäre aus dem oberen Beispiel meine ClassB, da meckert der Compiler bei der Variable pMap rum.
#ifndef EINHEIT_H #define EINHEIT_H #include "feld.h" // inheriting class's header file #include "map.h" #include <SDL/sdl.h> class Einheit : public Feld { private: bool lebendig; int einheitenID; int reichweite; int rasse; Map *pMap; //Dies soll als Referenz dienen public: // class constructor Einheit(); // class destructor ~Einheit(); void setLebendig(bool leb); bool getLebendig(); int getReichweite(); void move(int iX, int iY); //void setMapPointer(Map *pM); virtual void drawEinheit(SDL_Surface *view); }; #endif // EINHEIT_HSo und das is dann die so genannt ClassA
// Class automatically generated by Dev-C++ New Class wizard #ifndef MAP_H #define MAP_H #include "spielfeld.h" #include "einheit.h" #include <SDL/sdl.h> /* * No description */ class Map { private: Spielfeld **felder; Einheit **troop; //Daraus bastell ich später ein 2 Dimensionales Array int dimX; int dimY; int dimXTroop; int dimYTroop; SDL_Surface *view; public: // class constructor Map(int resoX, int resoY, int firstDimTroop, int secondDimTroop, char *cpPath, SDL_Surface *mapView); // class destructor ~Map(); void setTroopInfo(int firstDim, int secondDim); void setResolution(int nX, int nY); void setFeld(int nX, int nY, int SFNum); void setFeldPos(int dimX, int dimY,int x, int y); void setTroop(int index, int indexY, int x, int y); void drawMap(); int checkClickedItems(int xKoor, int yKoor); int initFelderBase(char *cpPath); int initTroopBase(char *cpPath); void markFeld(int i, int j, bool set); void troopClicked(int xKoor, int yKoor); int* felderClicked(int xKoor, int yKoor); }; #endif // MAP_HSorry für das krumme Einrücken

-
Ich hätte das "relevant" wohl lieber nicht in Klammern setzen sondern fett, kursiv und dreifach schreiben sollen...
// einheit.h #include "feld.h" // inheriting class's header file #include <SDL/sdl.h> class Map; class Einheit : public Feld { // ... Map *pMap; //Dies soll als Referenz dienen }; // Einheit.cpp #include "map.h" // das gleiche am besten auch für map.h
-
Sorry ich hab es sogar überlesen.
also map.h
#include "einheit.h" #include <SDL/sdl.h> class Map { private: Einheit **troop; //Hier raus entsteht ein 2 Dimensionales Array // map.cpp #include "einheit.h"
-
Du hast zwei Klassen, die sich gegenseitig kennen müssen - da benötigst du eine forward-Deklaration zumindest von einer der Klassen

-
Okay hab sowas noch nie gemacht, aber ich werd dann wohl mal googeln müssen oder hat einer was zu diesem Thema parat ?
-
Hi!
Wie oft noch???
A.h
class B; class A { B *obj; };B.h
class A; class B { A * obj; };A.cpp
#include "B.h" // DefinitionB.cpp
#include "A.h" // Definitiongrüße
-
Was heißt wie oft noch
Das ist in C++ gar nich erlaubt und somit erst gar nicht möglich, zumindest nicht im DEV CPP !!! Weil ich mit meiner Annahme im erst eintrag recht hatte.
-
Was ein Schwachsinn...
Das ist in C++ erlaubt und somit erst recht möglich, und mit ziemlicher Sicherheit kann der gcc, den Dev-C++ benutzt das auch. WIE, wurde Dir schon dreimal oder so gepostet.
-
So hab den Fehler gefunden es hat irgendwas mit meine DEV zu tun. Weiß der Geier was. Hab das grad beim Kollegen aufn Notebook getestet, da läufts. Erstmal Danke für eure Hilfe(n), auch wenn es zur Aufregung geführt hat.
Dann mal ein genehmes WE.