1

Java コードを見て、C++ でどのように実装されるかを確認したいと思います。

public interface IThing {
    public void method1();
    // more (virtual methods)
}

public interface IThingFactory {
    public IThing getThing(ThingType thing);
}

public interface IFactory<T> {
    public T createInstance();
}

public class A {
    A(ThingType thingType, IFactory<IThing> thingFactory, ...) {
        // ...
    }

    static A create(ThingType thingType, final IThingFactory thingFactory) {
        return new A(new IFactory<IThing>() {
        {
            public IThing createInstance()
            {
                return thingFactory.getThing(thingType);
            }
        }, new IFactory< ... >()
        {
            public IAnother createInstance()
            {
                return anotherFactory.getAnother(anotherType);
            }
        });
    }

    // ... 
}

上記のコード(完全ではありません)が、私が見つけようとしていることを示していることを願っています。私の問題は、それが C++ でどのように行われるかです。主に、匿名関数の実装のようにcreateInstance、コンストラクター呼び出しの内部の実装を理解していません (私にはまだ不完全なようです)。(抽象) 型のオブジェクトが定義されるように C++ でメソッドをA実装する方法がわかりません。この方法では (仮想) メソッドはまだ純粋であるためです。それとも、ある種のラムダ関数でそれを行うことができますか?createInstanceIFactory<IThing>createInstance

これを C++ でコーディングする方法を教えてもらえますか? 情報をありがとう!

4

2 に答える 2

1

Java 言語仕様には次のように書かれています。

非修飾および修飾されたクラス インスタンス作成式は、必要に応じてクラス本体で終了できます。このようなクラス インスタンス作成式は、無名クラス (§15.9.5) を宣言し、そのインスタンスを作成します。

その匿名クラスは、クラス インスタンス作成式で指定されたクラスのサブクラスです (あなたの場合: IFactory)。

匿名クラスの特別な機能は、周囲のスコープの最終変数にアクセスできることです。これは、値を匿名サブクラスのコンストラクターに提供することで実装され、コンストラクターはその値をそのサブクラスの final フィールドに格納します。

したがって、C++ への直接的な変換は、これらの値をコンストラクターのパラメーターとして受け取る名前付きサブクラスをインスタンス化することです。コードが実際に行うことによっては、より慣用的な翻訳が存在する場合があります。

于 2013-02-17T15:58:44.657 に答える
0

C++ では、匿名の構造体を持つことができるのと同じように、匿名のクラスを持つこともできます (クラスは非公開の構造体と同じです)。

ただし、匿名クラスをクラス B から明示的に継承させることはできないため、これを使用しない方がよいと思います。メイン関数では、非常に醜い B* にキャストされます。さらに、 new 演算子を直接使用することはできません。匿名クラスに適用されます。したがって、無名インスタンス c がスタックに割り当てられ、プログラムがスコープ外になると削除され、問題が発生します。

名前付きサブクラスを使用するのが標準的な方法です。

#include <iostream>
using namespace std;

// class B is a pure virtual class which is equivalent to interface in java.
class B
{
public:
    virtual int F() = 0;
};

class A
{
public:
    B * bb;
public:
    A(B* b);
};

A::A(B*b)
{
    bb = b;
}

int main()
{
    class{public: virtual int F(){return 10;}} c;
    A a((B*) &c);
    cout<<a.bb->F()<<endl;
}
于 2013-02-17T16:45:03.520 に答える