2

私はC++を使用してそのような結果を達成したい:

ジャワ:

public interface ITemp {
    void onCall(double value);
}

主に:

double d=2;
ITemp mVariable = new ITemp() {
@Override
    public void onCall(double value) {
    ... what to do... you can use 'd' variable...
    }
};

C++ の場合:

class ITemp {
public:
    virtual void onCall(double something) =0;
    virtual ~ITemp();
};

主に:

double d=2;
ITemp mVariable = .... // I cannot instantiate class containing pure virtual method
// But I want to use variable d to create a method
4

3 に答える 3

3

C++ では無名クラスを作成できないため、正確にはできませんが、似たようなことはできます。

int main()
{
    double d = 2;
    class T : public ITemp
    {
        double& m_v;
    public:
        T(double& v) : m_v(v) {}
        void onCall(double value)
        {
            // Do something with m_v;
            m_v *= value;
        }
    } t(d);
    t.onCall(4);
    std::cout << "d: " << d << std::endl;  // d is 8.
}

参照 ('&') はm_v と同じ変数を作成しますdが、名前は異なります。

于 2012-07-30T14:49:17.977 に答える
1

インターフェイスを名前のないクラスとして実装できますが、ローカル変数にアクセスしてクロージャーを作成することはできません。

int main(int argc, char* argv[])
{
    class : public ITemp
    {
    public:
        virtual void onCall(double something)
        {
            std::cout << something;
        }
    } temp;

    ITemp& itemp = temp;

    itemp.onCall(100.3145);

    return 0;
}
于 2012-07-30T15:14:25.980 に答える
1

コンストラクターで d を使用してクラスを構築するのはどうですか?

    class ITemp {
      double m_d;
    public:
      ITemp(double d) : m_d(d) {}
      virtual void onCall(double something) = 0; // inside, you can use m_d variable         along with something for whatever you want.
      virtual ~ITemp();
    };

onCall メソッドで何が行われているのか、どのように使用したいのか理解していないと思います。d を使用する場合は、コンストラクターに渡すか、別のパラメーターとして onCall に渡します。

もちろん、それが目的でない場合は、テンプレートが役に立ちます。ただし、これらは通常、毎回異なる型をクラスに送信するために使用されます。あなたはそれを必要としないようです。

于 2012-07-30T14:48:12.560 に答える