2016-08-05 25 views
2

Ich bin nach ziemlich langer Zeit wieder mit C++ zu arbeiten, benutze Java fast ausschließlich, also treffe ich Fehler, wenn ich versuche, Dinge zu tun, die ich in Java machen kann, aber nicht in C++.C++ Können beim Deklarieren eines Objekts virtuelle Methoden implementiert werden?

In diesem Fall in Java ich so etwas tun könnte:

class MyClass 
{ 
    public void myMethod(); 
} 

// ------- 

MyClass myObject = new MyClass(){ 
    myMethod() 
    { 
     // Do stuff 
    } 
}; 

Im Grunde bin ich die Logik für myMethod Umsetzung(), wenn die MyClass Objekt deklarieren (Beachten Sie, dass mein Syntax könnte deaktiviert sein).

Ich versuche, herauszufinden, ob es ein Äquivalent ist für C++

Mein spezifischen Anwendungsfall ist eine Reihe von Tests für einen Server/Client-Architektur, wo die Testobjekte, die Basis Server/Client abstrakte Klassen erweitern und implementieren die virtuellen Methoden, die ihr Verhalten steuern. Ich muss dieses Verhalten für jeden spezifischen Test ändern, und es wäre praktisch, diese Implementierungen bei der Deklaration der Testobjekte "einzubinden", anstatt mehrere Varianten des Testobjekts für jeden spezifischen Test implementieren zu müssen.

Danke!

EDIT: I Smeeheey ‚s Antwort implementiert haben wie folgt und wirkt wie ein Zauber

int main(...) 
{ 

    class TestServer : public BaseServer 
    { 
     public: 
     TestServer(...) : BaseServer(...){...} //Constructor 

     void virtualFunction(...){...} // Extended function 
    }; 

    TestServer testInstance(...); 

    // Execute tests using testInstance object 

}

+0

Ziemlich sicher, dass die Schnittstelle für eine bestimmte Klasse beim Kompilieren gesperrt ist. Das einzige, was Sie danach tun können, ist die Manipulation von Funktionszeigern oder das Hinzufügen von * lambda * -Typ-Methoden, die eine spezielle Behandlung erfordern. – tadman

+2

XY-Problem? Verwenden Sie eines der klassischen Designmuster. –

Antwort

10

Sie können tatsächlich ziemlich nahe kommen, mit einem anonymen lokalen struct/class:

class MyClass 
{ 
public: 
    virtual void doStuff() = 0; 
}; 

void doStuffWithMyStruct(MyClass& s) 
{ 
    s.doStuff(); 
} 

int main() 
{ 
    class: public MyClass 
    { 
    public: 
     void doStuff() override 
     { 
      std::cout << "Hello" << std::endl; 
     } 
    } s; 

    doStuffWithMyStruct(s); 

    return 0; 
} 

Beachten Sie, dass in den oben genannten, die Variable s einen anonymen Typ hat, sehr ähnlich wie Java. Auf seine Funktionen kann in Bezug auf seinen Basistyp zugegriffen werden. Live-Demo here.

+0

Das geht leider nicht, da die Basisklasse, die ich teste, unverändert bleiben sollte, damit die Tests tatsächlich gültig sind, aber trotzdem ist es ein interessanter Trick. – Oskuro

+0

Sie müssen die Basisklasse nicht ändern, damit dies funktioniert. Warum hast du gedacht, dass du würdest? Genau diesen Trick habe ich zuvor für genau Ihren Anwendungsfall verwendet: Unit Testing – Smeeheey

+0

Sie erwähnen Strukturen und verwenden sie in Ihrem Beispiel.:( – Oskuro

1

Nein, es gibt kein Äquivalent in C++, noch könnte es sein, für die Art, wie Klassen in C++ verwendet werden.

In Java wird dadurch ein neuer Klassentyp erstellt, der sich von MyClass ableitet und myMethod() überschreibt. Dies funktioniert, weil Variablen des Typs MyClass nur Referenzen sind, so dass diese Variablen Verweise auf abgeleitete Klassen enthalten können.

In C++ sind Variablen vom Typ MyClass keine Referenzen. Sie müssen vom Typ MyClass sein, sonst nichts. Während es für MyClass & möglich ist, einen Verweis auf eine Klasse zu halten, die von MyClass abgeleitet wird, ist die Verwendung von Verweisen (oder Zeigern) in diesem Fall sehr unidiomatisches C++.

Verwandte Themen