błąd logiczny (?) przy tworzeniu klas

0

Dzień dobry.
Mam chyba dość klasyczny problem jednak nie znalazłem żadnych konkretnych rozwiązań, może za słabo szukałem...

Posłużę się uproszczonym przykładem:

class A
{
    public:

	b *_b_;
	c *_c_;

	A ()
	{
	    _b_ = new b (this);
	    _c_ = new c (this);
	}

	void F1 ()
	{
	    //robi cos z _c_
	}
	void F2 ()
	{
	    //robi cos z _b_
	}
};

class b
{
    public:

	A *_a_;

	b (A *_a_)
	{
	    this->_a_ = _a_;
	}

	void Fn ()
	{
	    _a_->F1();
	}
};

class c
{
    public:

	A *_a_;

	b (A *_a_)
	{
	    this->_a_ = _a_;
	}

	void Fn ()
	{
	    _a_->F2();
	}
};

Jeśli umieszczę klasy w osobnych plikach, dołączę wszędzie ich definicje itd, to nie zadziała, pojawią się błedy jak np. "invalid use of incomplete type struct ..." itd.
Wydaje mi się, że jest tu błąd logiczny tzn. jest próba utworzenia jednej klasy ale nie da się bo druga klasa nie jest kompletna z tego powodu że ta pierwsza nie została utworzona i tak w nieskończoność, czyli kompilator ma prawo się zbuntować.
Słyszałem, że w javie można zrobić coś takiego i niektórzy często stosują tekie rozw. Tylko jak to zrobić w c++ ?
Jeśli klasy b i c nic nie wiedzą o klasie A i "komunikują się z nią" przy pomocy jakiejś zewnętrznej zmiennej globalnej wszystko jest ok. Jednak taki pomysł wydaje mi się nienajlepszy. Jak Wy rozwiązujecie taki problem?
Wszelkie wskazówki i sugestie miele widziane.

1

a.h

#ifndef A_H
#define A_H

class A;

#include "b.h"
#include "c.h"

class A
{
    public:
        b *_b_;
        c *_c_;
        A ();
        void F1 ();
        void F2 ();
};

#endif

a.cpp

#include "a.h"

A::A ()
{
    _b_ = new b (this);
    _c_ = new c (this);
}

void A::F1 ()
{
    //robi cos z _c_
}


void A::F2 ()
{
    //robi cos z _b_
}

b.h

#ifndef B_H
#define B_H

class b;

#include "a.h"
#include "c.h"

class b
{
    public:
        A *_a_;
        b (A *_a_);
        void Fn ();
};


#endif

b.cpp

#include "b.h"

b::b (A *_a_)
{
    this->_a_ = _a_;
}
 
void b::Fn ()
{
    _a_->F1();
}

c.h

#ifndef C_H
#define C_H

class c;

#include "a.h"
#include "b.h"

class c
{
    public:
        A *_a_;
        c (A *_a_);
        void Fn ();
};


#endif

c.cpp

#include "c.h"

c::c (A *_a_)
{
    this->_a_ = _a_;
}
 
void c::Fn ()
{
    _a_->F2();
}
0

Wszystko ok, dziękuje za odp.

edit:
hmm a czy da się to zrobić w ten/podobny sposób nie dzieląc klas na h i ccp, umieszczając całą treść klasy w pliku h. ?

0

umieszczając całą treść klasy w pliku h.

Możesz tak samo jak umieściłeś w .cpp - kompilator nie rozróżnia tak naprawdę plików .h od .cpp, liczy się tylko że z jednego pliku jest #include'owany drugi.
Rozszerzenia plików to tylko konwencja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1