Vererbung



  • Guten Tag,

    ich versuche seit Stunden herauszufinden, woran es liegt dass meine Memberfunktion, bzw der Aufruf davon nicht klappt.
    (bin auch noch ziemlich neue in dem Gebiet, heh)

    vom Compiler wird folgendes ausgegeben:

    "Fehler C2027 Verwendung des undefinierten Typs "CControl" Zeile 24

    "Fehler C2227 Links von "->out" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden." Zeile 24

    Mein Code sieht folgendermaßen aus:

    #include "stdafx.h"
    #include <iostream>
    
    #include <vector>
    
    /////////////////////////////////////////////////// CTab
    
    class CTab
    {
    	friend class CControl;
    
    public:
    
    	void RegisterControl(CControl* obj)
    	{
    		Controls.push_back(obj);
    	}
    
    	void ListControls()
    	{
    		for (int i = 0; i < Controls.size(); ++i)
    		{
    			Controls[i]->out(); // Fehler!
    
    			//std::cout << Controls[i] << std::endl;  ------- Die nicht initialisierte lokale Varialbe "startTab" wurde verwendet.
    		}
    	}
    
    private:
    	std::vector<CControl*> Controls;
    };
    
    /////////////////////////////////////////////////// CControl
    
    class CControl
    {
    	friend class CTab;
    
    public:
    	// kein konstruktor nötig.
    	// weitere eigenschaften folgen noch..
    protected:
    
    	int x, y, w, h;
    
    	virtual void out() = 0;
    };
    
    /////////////////////////////////////////////////// CControl Elemente
    
    class Rechteck : public CControl
    {
    
    public:
    
    	Rechteck(int x, int y, int w, int h)
    	{
    		this->x = x;
    		this->y = y;
    		this->w = w;
    		this->h = h;
    	}
    
    protected:
    
    	void out()
    	{
    		std::cout << "Objekt:: X " << x << " | Y " << y << " Width " << w << " | Height " << h << std::endl;
    	}
    };
    
    int main()
    {
    	// für Testzwecke 2 Rechtecke erstellen, und diese an den StartTab anfügen.
    	CControl * rechteck = new Rechteck(100, 50, 20, 5);
    	CControl * rechteck2 = new Rechteck(5, 45, 70, 89);
    
    	CTab * startTab;
    
    	startTab->RegisterControl(rechteck);
    	startTab->RegisterControl(rechteck2);
    
    	system("PAUSE");
    }
    

    Für jegliche Hilfe bedanke ich mich!
    Lg, Thomas



  • Set Stunden, soso. Du definierst CControl erst nach CTab. Die Klasse ist an der vom Compiler bemängelten Stelle nicht bekannt. Durch die friend Deklaration hast du den Namen bekannt gemacht, du kannst daher Pointer benutzen, aber nicht dereferenzieren. Lösung: vertausche die Klassendefinitionen.

    Warum ist out protected und nicht public? Wenn man alles befreunden muss ist das verdächtig.

    Es fehlt der virtuelle Destruktor in der abstrakten Klasse.

    Welcher Depp hat dir C... beigebracht?



  • Wenn es mir ein Depp beigebracht hätte, bin ich es wohl selbst gewesen.
    Als Neuling macht man nunmal nicht alles perfekt, nicht wahr?

    nungut,schonmal danke dafür, es funktioniert so.

    Zu dem Destruktor den du genannt hast der fehlt: z.B. wenn ich eine DLL habe, und diese entladen wird (DLL_PROCESS_DETACH), wird doch sowieso alles von heap bereinigt oder nicht? ( Die erstellten Objekte müssen / sollen eh nicht gelöscht werden, solange die DLL aktiv ist.

    Wenn ich falsch liege gib mir ruhig Anschiss.

    Lg Thomas



  • Selbst wenn es hier und jetzt tatsächlich so sein sollte, dass die Objekte nie vom Programm aus gelöscht werden sollten, ist das kein Grund für schlechte Angewohnheiten. Nächste Woche überlegst du es dir anders und schon ist das Programm fehlerhaft.


Log in to reply