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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von holli (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von holli (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Super, Danke, das klappt.

von Dr. Sommer (Gast)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.