Problem mit Objektreferenz



  • Hallo zusammen,
    ich möchte in meinem Programm gerne in einer Ringliste alle mir bekannten Geräte speichern. Dazu habe ich folgende Prototypen definiert:

    class PCIDevRing
    {
    public:
    	PCIDevRing();
    	~PCIDevRing();
    	void			addDevice(PCIDevRing ring, unsigned short vendorID, unsigned short deviceID, unsigned char bus, unsigned char device, unsigned char function);
    	void			createRing(PCIDevRing ring);
    	unsigned int	getDeviceCounter();
    
    private:
    	unsigned short	vendorID;
    	unsigned short	deviceID;
    	unsigned char	bus;
    	unsigned char	device;
    	unsigned char	function;
    	unsigned short	counter;
    	PCIDevRing		nextDevice;
    	PCIDevRing		previousDevice;
    };
    

    Nun habe ich das Problem bei den letzten beiden Zeilen meckert der Compiler (g++). Ich kenne von Java her die Möglichkeit Objektreferenzen so zu speichern. G++ meldet mir jedoch "Feld <<nextDevice>> hat unvollständigen Typen." und "Feld <<previousDevice>> hat unvollständigen Typen.". Was mache ich falsch, offenbar kann ich die letzten beiden Zeilen so nicht formulieren, aber wo liegt mein Denkfehler und wie müssten diese Zeilen korrekt lauten?

    Danke für eure Hilfe 😃



  • Alle Typen, die du in einer Klasse hast, müssen vollständig bekannt sein. Das kann bei dir gar nicht der Fall sein, da du das Objekt selbst brauchst, während du noch in der Definition bist.

    Die Lösung besteht darin, dass du lediglich einen Zeiger auf das Objekt speicherst, da der Typ eines Zeigers auf ein Objekt dem Compiler bekannt ist und die Grösse des Objektes selbst nicht wissen muss.

    Das ist halt ein Unterschied zu Java. In C++ sind das noch wirkliche Objekte, und nicht lediglich Zeiger auf die. 😉



  • Achso, dann also einfach so:

    class PCIDevRing
    {
    public:
        PCIDevRing();
        ~PCIDevRing();
        void            addDevice(PCIDevRing ring, unsigned short vendorID, unsigned short deviceID, unsigned char bus, unsigned char device, unsigned char function);
        void            createRing(PCIDevRing ring);
        unsigned int    getDeviceCounter();
    
    private:
        unsigned short    vendorID;
        unsigned short    deviceID;
        unsigned char    bus;
        unsigned char    device;
        unsigned char    function;
        unsigned short    counter;
        unsigned int        *nextDevice;
        unsigned int        *previousDevice;
    };
    

    Müsste jetzt soweit richtig sein oder?



  • Warum unsigned int?!

    PCIDevRing obj; // Objekt des Types PCIDevRing
    PCIDevRing* pobj; //Zeiger auf ein Objekt mit Typ PCIDevRing
    

    Ich habe irgendwie das Gefühl, dass du dich nicht wirklich mit C++ beschäftig hast und die riesen Unterschiede zwischen Java und C++ nicht ganz siehst.. Syntax ist ähnlich, aber viele Konzepte sind von Grund auf anders und somit sehr verwirrend, wenn man von einem Standardverhalten ausgeht. Ich empfehle ein anständiges Tutorial zu C++ oder ein gutes Buch. Sonst wirst du nur Ärger haben, was nicht sein muss.

    z.B sei gesagt, dass wenn du den Zeiger da oben hast noch kein Objekt hast. Das muss du zuerst irgendwie erzeugen. (new wahrscheinlich). Und dann musst du dich um die ganze Speicherverwaltung kümmern (mit delete wieder freigeben) und dafür sorgen,dass auch im Falle einer exception dein Objekt wieder richtig zerstört wird.. usw.


Anmelden zum Antworten