1

C++でこれを行うにはどうすればよいですか

interface ActionListener { void actionPerformed(); }
jButton.addActionListener(
    new ActionListener(){ void actionPerformed() { do something } }
);

これまでのところ私はこれを知っています、

class ActionListener {
  public : 
    virtual ~ActionListener(){}
    virtual void actionPerformed() = 0;
}

この後、私は何をしますか...この種の実装を行うためのキーワードも役立ちます。

4

4 に答える 4

4

C ++には、Javaで見られるような匿名クラスは実際にはありません。通常は、インターフェイスクラスから継承するサブクラスを宣言するだけです。Javaの匿名クラスインスタンスに最も近いのは次のようなものです。

class : public ActionListener {
public:
    virtual void actionPerformed() {
        // do something
    }
} listener;
thing.addActionListener( listener );
于 2012-07-12T05:18:02.080 に答える
1

C++で行うことは他にあまりありません。最終的に多重継承を使用する場合にダイヤモンド継承の問題を回避するために、実装時に仮想継承を使用することをお勧めします。

class SomeActionListener : virtual public ActionListener{
  public : 
    virtual ~ActionListener();
    virtual void actionPerformed();
}

overrideC ++ 11では、メソッドの実装にも使用できます。これは、メソッド名を誤って入力した場合やcv修飾子を間違えた場合に備えて、コンパイル時にチェックします。この場合、オーバーライドは行われません。

class SomeActionListener : virtual public ActionListener{
  public : 
    virtual ~ActionListener();
    virtual void actionPerformed() override;
}
于 2012-07-12T05:19:02.250 に答える
1

「C++でこれを行うにはどうすればよいですか?」-あなたがやろうとしているのは、ボタンにコールバックを登録することのようです。C ++では、別の方法でそれを行います。抽象クラスやインターフェース(OOの意味で)を提供する必要はありません。代わりに、ボタンはコールバックを登録するための次の関数を提供する可能性があります。

void Button::addActionListener(std::function<void()> callback);

のタイプは、callback「引数なしで呼び出すことができ、何も返さない任意の関数、関数ポインター、または参照」です。次に、次のようにコールバックを登録します。

cppButton.addActionListener( [&]{ do something; } );
// lambda
于 2012-07-12T06:55:16.410 に答える
0

から継承しActionListenerます。

C++は多重継承をサポートしています。Javaはそうではないので、インターフェースに依存する必要があります。

于 2012-07-12T05:16:40.427 に答える