Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Events as Properties in C++ (https://www.delphipraxis.net/55927-events-properties-c.html)

sniper_w 28. Okt 2005 23:20


Events as Properties in C++
 
Was ich in C++ vermisse, ist die Möglichkeit Events (im Delphi Sinne) einem Objekt zuzuweisen (als Eigenschaft). Oder habe ich etwas verschlaffen ?

Wie geht man da in c++ vor ?

sniper_w 29. Okt 2005 23:21

Re: Events as Properties in C++
 
**push**

Net7 30. Okt 2005 00:09

Re: Events as Properties in C++
 
C++ Syntax:

typedef void __fastcall (__closure *TSocketNotifyEvent)(System::TObject* Sender, TCustomWinSocket* Socket);



__property TSocketNotifyEvent OnClientDisconnect = {read=FOnClientDisconnect, write
=FOnClientDisconnect};

Sollte laut Delphihilfe so ähnlich gehen wie in Delphi

Tubos 30. Okt 2005 00:22

Re: Events as Properties in C++
 
Properties sind aber nicht Standard-C++ sondern eine Borland-Erweiterung.
In C++ gibt es keine Properties, wo man einfach instanz.variable=wert macht und es wird automatisch eine get/set-Methode aufgerufen.

sniper_w 30. Okt 2005 07:35

Re: Events as Properties in C++
 
@Net7: Das ist aber Borland C++ Dialekt.

Ich meinte eher C++ Standard.

Chewie 30. Okt 2005 08:03

Re: Events as Properties in C++
 
Zitat:

Zitat von sniper_w
Ich meinte eher C++ Standard.

Events sind in C++, wie bei Delphi, einfach Methodenzeiger. Wie das geht, steht in den ersten Codezeilen.
Ohne das Property musst du halt mit Getter- und Setter-Methoden arbeiten. Properties sind da ja nur eine vereinfachende Schreibweise.

sniper_w 30. Okt 2005 08:49

Re: Events as Properties in C++
 
Danke. Ich habe das schon so gemacht, ich habe nur gehoft dass es halt einfacher geht.

Und was die Methoden zeiger angeht, die Methoden, auf die man zeigt, dürfen leider nicht member functions sein sodern in global scope definiert sein. Oder ?

tommie-lie 30. Okt 2005 10:04

Re: Events as Properties in C++
 
Zitat:

Zitat von sniper_w
Und was die Methoden zeiger angeht, die Methoden, auf die man zeigt, dürfen leider nicht member functions sein sodern in global scope definiert sein. Oder ?

Üblicherweise ja. Aber du kannst dir einen eigenen functor basteln:
Code:
template <class ClassType, typename ReturnType, typename Parameter1>
class functor_1
{
  public:
    // declare functor
    typedef ReturnType (ClassType::*Callback)(Parameter1);

    // setup functor
    functor_1(ClassType *some_object, Callback some_method)
      this->_object = some_object;
      this->_callback = some_method;
    };

    // call functor
    ReturnType
    operator()(Parameter1 param1)
    {
      return (_object->*_callback)(param1);
    }

  private
    ClassType *_object;
    Callback _callback;
}
Ist zwar ungetestet, sollte aber funktionieren. Verwenden tut man ein derartiges Template wie folgt:
Code:
ClassA a;
ClassB b;

functor_1<ClassA, int, int> *functor;

int
ClassB::emit_event()
{
  return functor(3);
}

int
ClassA::some_method(int i)
{
  std::cout << i;
  return ++i;
}

int
main()
{
  functor = new functor_1<ClassA, int, int>(&a, &ClassA::some_method);
  int blubb = b.emit_event();
}


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz