2017-02-04 9 views
3

私はこの質問がちょっと奇妙だと知っていますが、私には負担してください。C++でインターフェイスのオブジェクトを作成する

私は駐車場用のOODを設計しています。私は駐車することを許可したいのですが、その車両にはautoparkの機能があります。 Javaでは、インターフェースを作成し、そのインターフェースのオブジェクト(すなわち、autoparkの機能を持つ車)のみが駐車できるようになりました。 C++では、インターフェイスは純粋仮想メソッドを持つ抽象クラスを使用して作成されます。だから、私はこの 'C++インターフェイス'のオブジェクトを作成することはできません。だから、C++でこれをどうすれば実現できますか?

注:私は、autopark機能の有無を示すためにいくつかのフラグを使用するような他の技術を知っています。これらの回避策には興味がありません。

+3

Javaでインタフェースタイプのオブジェクトを作成することはできません。そこに違いはありません。 – chris

+0

@chris、匿名クラスを使用していますか?何か[ここ](http://stackoverflow.com/questions/3947708/this-appears-to-create-an-object-from-an-interface-how-does-it-work)? –

+1

これは、インターフェイスを実装する具体的な匿名クラスのオブジェクトを作成しています。 –

答えて

3

あなたは匿名の具象クラスを作成する方法を探しています。

C++では、構造体/クラスを変数宣言の '型'として扱うことで、匿名構造体を作成できます。以下では実装クラスがあります(匿名ですが、まだ純粋仮想/抽象クラスの基本クラスFooを拡張しています)。セミコロンで終わる代わりに、その匿名のインスタンスをすぐに割り当てる変数名を付けますスタック上のクラス。

したがって、CとC++のクラス、構造体、および列挙型はセミコロンで終わらなければなりません(namespaceのようなものはセミコロンではありません)。

#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; 
}; 
関連する問題