C++ 2 Klassen gegenseitigem Pointer auf Member Funktionen include loop

Gast #4990465
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?
Gast #4990505
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> ?
Gast #4990546
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren