2017-02-04 7 views
3

Ich weiß, dass diese Frage ein bisschen seltsam ist, aber bitte ertragen Sie mit mir.Erstellen eines Objekts einer Schnittstelle in C++

Ich entwerfe ein OOD für einen Parkplatz. Ich möchte nur die Fahrzeuge parken lassen, die eine autopark Funktion haben. In Java hätte ich eine Schnittstelle erstellt und nur die Objekte dieser Schnittstelle (d. H. Die Autos mit autopark Features) hätten parken dürfen. In C++ werden Interfaces mit abstrakten Klassen mit rein virtuellen Methoden erstellt. Also kann ich keine Objekte dieser 'C++ Schnittstelle' erstellen. Wie erreiche ich das in C++?

Hinweis: Ich kenne andere Techniken wie eine Fahne mit dem Vorhandensein oder Fehlen von autopark Funktion zu bezeichnen, etc; aber ich bin nicht an diesen Problemumgehungen interessiert.

+3

Sie können auch keine Objekte eines Schnittstellentyps in Java erstellen. Da gibt es keinen Unterschied. – chris

+0

@chris, mit einer anonymen Klasse? So etwas wie [hier] (http://stackoverflow.com/questions/3947708/this-appears-to-create-an- object-from-an-interface-how-does-it-work)? –

+1

Das erstellt ein Objekt einer konkreten anonymen Klasse, die die Schnittstelle implementiert. –

Antwort

3

Sie suchen nach einer Möglichkeit, anonyme konkrete Klassen zu erstellen.

In C++ können Sie durch die Behandlung der Struktur/Klasse, die als ‚Typ‘ für eine Variablendeklaration anonyme Strukturen erstellen. Im Folgenden haben wir die implementierende Klasse (beachten Sie, dass sie anonym ist, aber immer noch Foo, unsere rein virtuelle/'abstrakte' Basisklasse) und statt mit dem Semikolon enden, geben wir ihr einen Variablennamen, um sofort eine Instanz dieses Anonymen zu vergeben Klasse auf dem Stapel.

Daher müssen Klassen, Strukturen und Enumerationen in C und C++ mit einem Semikolon enden (während Dinge wie namespace nicht).

#include <iostream> 

using namespace std; 

class Foo { 
public: 
    virtual void bar() = 0; 
}; 

void callBar(Foo *foo) { 
    foo->bar(); 
} 

int main() { 
    class : public Foo { 
     virtual void bar() { 
      cout << "Hello from foo1" << endl; 
     } 
    } foo1; // <-- Note that we immediately create foo1 here... 

    class : public Foo { 
     virtual void bar() { 
      cout << "Bonjour from foo2" << endl; 
     } 
    } foo2; // <-- ... and foo2 here. 

    callBar(&foo1); 
    callBar(&foo2); 

    return 0; 
}; 
Verwandte Themen