2 Klassen (Gegenseitige Abhängigkeit) ??



  • Im folgenden Code wird die Klasse CElem in der klasse CGroup gespeichert.

    Über die Funktion Single der CElem klasse kann eine CGroup klasse erzeugt werdne, in der sich das CElem dann befindet..

    Problem die Klassen sind gegenseitig abhängig. mache ich eine Forward Deklaration "class CGroup;" vor elem kommt fehler "C2514: no construktor"
    oder mach ic hwas falsch?

    class CElem{
    
    	int m_i;
    public:
    	CElem(){}
    	CGroup* Single(){
           	return new CGroup(this);
    	}
    };
    
    class CGroup{
    
    	CTypedPtrArray<CPtrArray,CElem*> m_paElem;
    public:
    
    	CGroup(){}
    	CGroup(CElem *p){
    		m_paElem.Add(p);
    	}
    
    };
    


  • Zumindest eine der Klassen musst du in .cpp- und .h-Datei aufteilen - also die Definition von der Implementierung trennen -, dann passt das auch mit der Forward declaration.



  • jo wenn ich nun die zwei Klassen (Blöcke vertausche) und dann die nadre Forward Deklarier, funktioniert... das Problem triff wohl nur auf wenn ein Konstruktor im vorraus compalliert werden soll..



  • BorisDieKlinge schrieb:

    das Problem triff wohl nur auf wenn ein Konstruktor im v****** compalliert werden soll..

    Nein, das hat mit Konstruktoren nichts zu tun. In CGroup hantierst du nur mit dem CElem-Zeiger selbst, du greifst nicht über ihn auf das Objekt zu. Daher reicht hier die Forward declaration.



  • Eine Design Frage wage ich zu stellen.

    Ein Element hat eine Funktion die Single heisst, mit der eine Gruppe kreiert wird. Ich würde aus reiner Design-Sicht als ausgesprochen verwirrend betrachten. Immerhin wird die Gruppe mit new als neues Objekt angelegt, was aus dem FunktionsNamen "Single" in keinster Weise hervorgeht. Auch ist es nicht unbedingt naheliegend das ein Element seine Gruppe kreiert, man erwartet das eher umgekehrt.

    Ich persönlich würde das eher so machen:

    class CElem{
    
        int m_i;
    public:
        CElem(){}
    };
    
    class CGroup{
    
        CTypedPtrArray<CPtrArray,CElem*> m_paElem;
    public:
    
        CGroup(){}
        CGroup(CElem *p){
            m_paElem.Add(p);
        }
    
       static CGroup* CreateGroup(CElement* firstElement) {
          return new CGroup(firstElement);
       }
    
    };
    

    Auf die Art könntest Du z.B. auch in der Klasse CGroup eine statische Liste aller angelegten Gruppen verwalten oder ähnliches.



  • ja danke für den Tipp.. werde dies in Betracht ziehen;)



  • Hm, ich würde einfach einen place holder benutzen. Im prinzip so:

    class A;
    
    class B
    {
       A a;
    };
    
    class A
    {
       B b;
    };
    

    hatte auch mal das Problem, dass sich beide Klassen kennen mussten. sollte aufjeden fall funktionieren. Wenn du deine Klassendefinitionen in unterschiedlichen Header-Files hast, musst du darauf achten, dass das Include für die Klasse mit dem place holder nach der definition der anderen klasse kommt.

    gruß
    tyr377


Anmelden zum Antworten