Forum: PC-Programmierung C++ 2 Klassen gegenseitigem Pointer auf Member Funktionen include loop


von holli (Gast)


Lesenswert?

Hallo

ich habe eine Klasse in der Datei

parent.h
1
class Parent
2
{
3
public:
4
    Parent();
5
    void askChild();
6
    void doSomething();
7
    ...
8
    ...
9
    private:
10
    Child* child;
11
};
12
...
13
...

parent.cpp
1
...
2
...
3
void Parent::askChild()
4
{
5
    child->getAnswer();    
6
}

und eine andere Klasse in der Datei child.cpp

child.h
1
class Child
2
{
3
public:
4
    Child();
5
    void tellParent();
6
    void getAnswer();
7
    ...
8
    ...
9
    private:
10
    Parent* parent;
11
};
12
...
13
...

child.cpp
1
...
2
...
3
void Child::tellParent()
4
{
5
    parent->doSomething();    
6
}

Der Sinn ist, dass jede Parent Klasse eine child Klase beinhalet und 
dort getAnswer() aufrufen kann.
Manchmal macht Child aber auch Sachen die es Parent mitteilen will und 
macht dieses über tellParent()

Wie kann ich das Include Problem denn hier Lösen? Denn auch wenn ich 
eine forward declaration machen
vor der Definition von Parent
1
Class Child;
und vor der Definition von Child
1
Class Parent;
einfügen sind zwar die Klassen bekannt, aber ja nicht die Methoden der 
Klassen?

von MikeH (Gast)


Lesenswert?

In den Headerdateien machst du jeweils die forward Deklaration und in 
den .cpp Dateien inkludierst du die jeweilige andere Headerdatei.

von holli (Gast)


Lesenswert?

Super, Danke, das klappt.

von Dr. Sommer (Gast)


Lesenswert?

Und was hat das jetzt mit Pointern auf Member-Funktionen zu tun? Das ist 
doch nur ein ganz normaler direkter Aufruf einer Member-Funktion.

holli schrieb:
> Der Sinn ist, dass jede Parent Klasse eine child Klase beinhalet
Immer genau eine? Warum dann nicht einfach "Child child", warum als 
Pointer? Und wenn schon, warum nicht per unique_ptr<Child> ?

von Tom (Gast)


Lesenswert?

Manchmal ist es sinnvoll, die Rollen, die die Beteiligten erfüllen, in 
Interfaces auszulagern. Damit kann man die beiden Klassen unabhängig von 
der Implementation der jeweils anderen gestalten:
1
class IMuellrausbringer
2
{
3
public:
4
    virtual void bringe_muell_raus() = 0;
5
};
6
7
class ITaschengeldgeber
8
{
9
public:
10
    virtual int gib_geld() = 0;
11
};
12
13
class Child : public IMuellrausbringer
14
{
15
public:
16
    void bringe_muell_raus() override { cout << "ist erledigt\n"; }
17
    void tuwas() { int euros = m_versorger->gib_geld(); }
18
private:
19
    ITaschengeldgeber* m_versorger;
20
};
21
22
class Parent: public ITaschengeldgeber
23
{
24
public:
25
    int gib_geld() override { return 10; }
26
    void fruehjahrsputz() { m_helfer->bringe_muell_raus(); }
27
private:    
28
    IMuellrausbringer* m_helfer;
29
};

In einfachen Fällen erzeugt das nur überflüssige Komplexität, aber wenn 
es kompliziert wird, kann es die Struktur klarer machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.