Bidirektionale Assoziation zw. Objekten



  • Eine Frage an die Community, bei der ich selbst zur Zeit nicht so recht weiterkomme.

    Ich habe eine Klass A, die in einem std::vector n Objekte der Klasse B kapselt. Jedes Objekt der Klasse B, soll darüber hinaus eine Referenz auf die Klasse A enthalten, in dessen std::vector sie liegt.

    Leider bekomme ich die beiden Klassen nicht kompiliert, kann mir jemand sagen was ich hier falsch mache?

    #ifndef _A_H_
    #define _A_H_
    
    #include <vector>
    
    #include "B.h"
    
    class A {
    
    	private:
    		std::vector<B> mBs;
    
    	public:
    		A() {}
    		A(const A& pCopyMe);
    		virtual ~A() {}		
    
    		void addB( B& pB ) {
    			pB.setA( *this );
    			mBs.push_back(B);			
    		}
    
    		void setBs( const std::vector<B>& pBs ) { mBs = pBs; }
    		const std::vector<B>& getBs() const { return mBs; }
    };
    
    #endif	//_A_H_
    
    #ifndef _B_H_
    #define _B_H_
    
    #include "A.h"
    
    class B {
    
    	private:
    		A mA;
    
    	public:
    		B() {}
    		B( const B& pCopyMe );
    		~B() {}	
    
    		void setA(const A& pA ) { mA = pA; }
    		const A& getA() const { return mA; }
    };
    
    #endif	//_B_H_
    

    Danke für Eure Hilfe!



  • Balrog schrieb:

    #ifndef _B_H_
    #define _B_H_
    
    #include "A.h"
    
    class B {
    	
    	private:
    		A mA;
    

    Hattest du nicht gesagt "Referenz"? Dann deklarier doch auch eine solche:

    A& mA;
    

    Im Falle einer 0..1-Beziehung dagegen würde sich eher ein Zeiger anbieten, da man den auf null setzen kann.

    Mit der Deklaration als Referenz oder Zeiger erübrigt sich auch die Notwendigkeit, a.h einzubinden, es reicht eine Vorausdeklaration der Klasse:

    class A;
    


  • Ok, danke Freunde, die Sache hat sich erledigt. Ich hab's soeben selbst gelöst. Die Lösung möchte ich niemandem vorenthalten:

    #ifndef _A_H_
    #define _A_H_
    
    #include <vector>
    
    #include "B.h"
    
    class A {
    
    	private:
    		std::vector<B> mBs;
    
    	public:
    		A() {}
    		A(const A& pCopyMe);
    		virtual ~A() {}		
    
    		void addB( B& pB ) {
    			pB.setA( this );
    			mBs.push_back(pB);			
    		}
    
    		void setBs( const std::vector<B>& pBs ) { mBs = pBs; }
    		const std::vector<B>& getBs() const { return mBs; }
    };
    
    #endif	//_A_H_
    
    #ifndef _B_H_
    #define _B_H_
    
    class A;
    
    class B {
    
    	private:
    		const A* mA;
    
    	public:
    		B() {}
    		B( const B& pCopyMe );
    		~B() {}	
    
    		void setA(const A* pA ) { mA = pA; }
    		const A* getA() const { return mA; }
    };
    
    #endif	//_B_H_
    

Anmelden zum Antworten