Object erstellen im Funktionsaufruf



  • Moin Moin,

    Ich habe ein Problem mit einem Schulprojekt und zwar...

    class Verification
    
      {
    
        public:
          virtual bool verify( ) = 0;
    
      };
    

    Das würde Ich gern wie in Java aufrufen z.B.

    addWindowListener( new WindowListener( )
                      {
                        public void windowClosed(WindowEvent evt) 
                        {
                        };
                      } );
    

    Ist das überhaupt in C++ möglich und wenn ja wie?



  • Hi,

    wenn ich das richtig verstehe, möchtest Du nicht ein Objekt erstellen, sondern ein Klasse definieren ... und das zwar "lokal".
    IIRC geht das nicht. Und selbst wenn, wäre es sehr C++-unüblich - weswegen ich dringendst davon abrate.
    Es hat keinen Zweck, in C++ "Java zu programmieren". Das schafft mehr Probleme als es löst. Nimm Dir lieber ein bischen Zeit, um zu lernen, wie solche Dinge in C++ gemacht werden.

    Gruß,

    Simon2.

    P.S.: Nicht vergessen - mit "new" erzeugte Objekte musst Du in C++ manuell wieder abräumen!



  • ZellOr schrieb:

    Ich habe ein Problem mit einem Schulprojekt und zwar...

    Was möglich ist, ist mit lokalen Klassen zu arbeiten. Das von dir gezeigte ist aber nicht möglich:

    void foo()
    {
      class A
      {
        // ...
      };
    
      // Irgendwas mit der Klasse A machen
    }
    

    In deinem Fall wäre das vielleicht mit einer lokalen Klasse, die von einer speziellen Basisklasse abgeleitet wird, denkbar.

    class BaseEvent
    {
      public:
        virtual ~BaseEvent() {}
        // ...
    };
    
    void irgendwasMitBaseEvent(BaseEvent* event)
    {
      // ...
    }
    
    void foo()
    {
      class fooEvent : BaseEvent
      {
        // ...
      };
    
      irgendwasMitBaseEvent(new fooEvent);
    }
    

    cu André



  • danke!

    kann man so etwas machen...

    machtIrgendwas( bool test( )
                    {
                    } );
    

    ...sprich eine Funktion zu übergeben?



  • Simon2 schrieb:

    [...]
    Es hat keinen Zweck, in C++ "Java zu programmieren". Das schafft mehr Probleme als es löst. Nimm Dir lieber ein bischen Zeit, um zu lernen, wie solche Dinge in C++ gemacht werden.[...]

    Dran halten^^



  • ZellOr schrieb:

    danke!

    kann man so etwas machen...

    machtIrgendwas( bool test( )
                    {
                    } );
    

    ...sprich eine Funktion zu übergeben?

    Nein - warum willst Du das eigentlich tun ?
    Was versprichst Du Dir davon ?

    Ich glaube, sowas kommt im nächsten Standard und nennt sich da "lambda" ...

    Gruß,

    Simon2.



  • Jo, lambda expressions.
    Es gibt auch schon Libraries die es ermöglichen (sehr begrenzte) lambda expressions in C++ zu schreiben. Was manchmal recht praktisch sein kann.

    Siehe z.B. Boost.Lambda und Boost.Bind.

    Direkte Sprachunterstützung von C++ gibt es aber (noch) nicht.



  • Wofür sollen denn Bereichseingegrenzte Funktionen gut sein? Klärt mich auf!



  • Quellcode schrieb:

    Wofür sollen denn Bereichseingegrenzte Funktionen gut sein? Klärt mich auf!

    Man müllt sich nicht seinen namespace zu mit Zeug, das man nur einmal braucht.
    Ich denke, Auslöser sind <algorithm> und sortierte Container (wo man Funktoren braucht). Ganz nett kann man das in den "Proposals" zum neuen Standard nachlesen:
    A proposal to add lambda functions to the C++ standard und
    Lambda expressions and closures for C++
    Da beschreiben die Autoren eigentlich ganz gut, aus welcher "Klemme" Lambda expressions helfen wollen und wie sie das tun.
    (es gibt auch von 2007 noch Papers zu dem Thema, aber die habe ich mir noch nicht selbst angesehen)

    Insgesamt finde ich die diversen Papers sehr hilfreich. Davon wird nicht alles in den neuen Standard eingehen, aber man bekommt mal die Augen geöffnet für verschiedene Schwierigkeiten in C++ und Techniken, die C++ (noch) nicht hat (tw. andere Sprachen schon).
    Ist ein guter Blick über den Tellerrand.

    Gruß,

    Simon2.


Anmelden zum Antworten