Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.10.2015, 23:52

[C++,OOP] Funktion vom Klassen-Attribut aus aufrufen

Hallo liebe Gemeinde,

in einer Klasse habe ich eine Klasseninstanz als Attribut, die eine asynchrone Funktion hat. Ich möchte von dort aus die Vaterklasse informieren, nur wie?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Computer
{
        Computer()
        {
        thread.start...
        }

        void thred_ende()
        {
        Wohnung::Arbeit(daten); //Aufruf der Verinstanz
        }
};


class Wohnung
{
 Computer m_Computer;

 Aktion(daten)
 {
 ....
 }


};


Der Code soll als Bibliothek verfügbar sein, eine Kombination aus Template und statischem Quellcode wäre akzeptabel.


Gruß

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BilderbergerK« (28.10.2015, 03:56)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

28.10.2015, 00:04

Mal abgesehen davon, dass das wieder schwer nach Trollversuch aussieht: Wenn du eine nicht-statische Methode aufrufen willst, dann brauchst du eine konkrete Objektinstanz.

in einer Klasse habe ich eine Klasse als Attribut, die eine asynchrone Funktion hat.

Nein, du hast keine Klasse als Attribut. Du hast eine Klasseninstanz als Attribut.

Wenn das kein Trollversuch ist, dann empfehle ich dir wärmstens, ein Buch durchzuarbeiten und nicht gleich mit so abgefahrenen Sachen wie asynchronen Funktionaufrufen und Templates zu arbeiten. Dir fehlen nämlich noch die einfachsten Grundlagen.

3

28.10.2015, 04:01

Hallo,

ich möchte keine statische Funktion aufrufen.
In den Büchern finde ich keine Lösung, eventuell habe ich einen Logik-Fehler.
Daher suche ich Rat bei den Profis.

Danke!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BilderbergerK« (28.10.2015, 04:12)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.10.2015, 04:31

ich möchte keine statische Funktion aufrufen.

Genau das versuchst du aber zu tun.

Wenn du eine nicht-statische Methode aufrufen willst, dann brauchst du eine konkrete Objektinstanz.

5

28.10.2015, 04:37

ich möchte keine statische Funktion aufrufen.

Genau das versuchst du aber zu tun.

Wenn du eine nicht-statische Methode aufrufen willst, dann brauchst du eine konkrete Objektinstanz.

Mit anderen Worten ich komme nicht an ein Templet herum. :thinking:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.10.2015, 04:40

Mit Templates hat das gar nichts zu tun.

C-/C++-Quelltext

1
2
3
// Aufruf einer nicht-statischen Methode:
Mensch hans;
hans.aufKloGehen();

Gibt's bei dir in China keine C++-Bücher, mit denen du lernen kannst?

7

28.10.2015, 04:56

Mit Templates hat das gar nichts zu tun.

C-/C++-Quelltext

1
2
3
// Aufruf einer nicht-statischen Methode:
Mensch hans;
hans.aufKloGehen();

Gibt's bei dir in China keine C++-Bücher, mit denen du lernen kannst?


Sieht wohl so aus, als habe ich mich nicht richtig ausgedrückt. Ich will die Klasse benachrichtigen die eine Klasseninstanz enthält.

Dies ist diee einzeige Möglichkeit, die mir einfällt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T>
class Kind
{
T *parent;
...
 int einkommen(long anzhal)
 {
 parent->einkommen(anzahl/10);//Vater ein bisschen vom Einkommen abgeben..
 }

};

classe Vater
{
 Kind k; //k(this)
int einkommen(long);
}


Sicher ist das Beispiel an einer Familie zu bemängeln, ich denke aber ihr versteht, was ich meine.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

28.10.2015, 05:34

Ja, genau, du speicherst einfach einen Zeiger oder eine Referenz auf das Elternobjekt.
Aber du brauchst hier kein Template.

9

28.10.2015, 06:21

Ja, genau, du speicherst einfach einen Zeiger oder eine Referenz auf das Elternobjekt.
Aber du brauchst hier kein Template.
Leider weiß ich nicht im Voraus, wie die Klasse lautet, das ist ja mein Problem.
Des weiteren will ich meine Funktion in einer Bibliothek einbauen und von der App aufrufen. Das Problem tritt immer wieder auf und habe dafuer keine gute Lösung.

Sagen wir mal wir haben ein in asynchrones System. Ein Haus mit vielen mechanischen Vorgängen.
Per Knopfdruck wird eine Tür aufgemacht, die Tür wird langsam aufgeklappt und wenn sie ganz offen ist geht ein grünes Licht an:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
class Lampe
{
void *parent=0;

   Lampe(void *Parent)
  {
  parent=Parent;
  }

  SetColour(rgb colour)
  {
   //...
  }
};

class Schalter
{
void *parent=0;

   Schalter(void *Parent)
  {
  parent=Parent;
  }

void click()
 {
  //asyncrones Verfahren einleiten um die Tür langsam aufzumachen
  //und ruft dann offen auf, wenn ganz offen, oder amschliessen wenn nicht.
 }

  void offen()
  {
  parent->Action(TUER_OFFEN, 1);
  }
  
  void amschliessen()
  {
  parent->Action(TUER_OFFEN, 0);
  }


};


class Tuer
{

Schalter m_schalter;
Lampe m_Lampe;
 Tuer() : m_schalter(this), m_Lampe(this)
 {}
 
 int Aktion(unsigned int id, int val)
 {
    switch(id)
   {
   case TUER_OFFEN:
    m_Lampe.setColour(rgb(0,200,0));
    break;
   default:

    m_Lampe.setColour(rgb(200,0,0));
    break;
   }
 }

};



class Haus
{

Tuer t;

};

Haus haus;
haus.t.m_schalter.click(); // aufruf von Schalter, wenn Tuer offen ist, dann wird t benachrichtigt und ruft dann t.m_lampe.SetColour() auf

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BilderbergerK« (28.10.2015, 06:34)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

28.10.2015, 06:37

Dann willst Du kein void* übergeben, sondern womöglich eine std::function, die Du aufrufen kannst, sobald es soweit ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige