3

わかりましたので、少しばかげた質問がありますが、それを行う方法があれば役立つと思います。

とにかく、次のクラスがあるとします。

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

継承せずに Foo を使用したい場合はどうすればよいですか? 単純に次のことを行う方法はありますか (Show を実装するためにまったく新しいクラスを作成するのではなく):

Foo F;
F.Show = [&]{/*Do something here*/}; //Assign some function or Lambda to Foo instance F

それを行う方法はありますか?ばかげているように思えますが、それまたは同様のことができるかどうかを知る必要があります。

明らかにコンパイルされません:l

4

5 に答える 5

4

それを行う方法はありますか?

Fooいいえ、純粋な仮想メンバー関数がある場合はインスタンス化できません。

それまたは同様のことができるかどうかを知る必要があります。

似ているとはどういう意味かによって異なります。純粋な仮想について忘れた場合は、ラムダ式、別のエンティティ、またはその署名と戻り値の型を持つ呼び出し可能なエンティティから設定できるFoo::Show()、たとえば の観点から実装を提供できます。std::function<void()>std::function<void()>

#include <functional>
class Foo
{
 public:
  virtual void Show() { fun(); }
  std::function<void()> fun;
};

それで

#include <iostream>
int main()
{
  Foo f;
  f.fun = []{std::cout << "Hello, World!";};
  f.Show();
}

@MrUniverseのコメントで示唆されているように、関数を呼び出す前に関数が割り当てられているかどうかを確認する必要があります。これは簡単に行うことができます:

virtual void Show() { if (fun) fun(); };
于 2013-05-24T05:16:41.377 に答える
3

そのようなものはうまくいく:

#include <functional>
#include <iostream>

class Foo
{
public:
  std::function<void(void)> Show;
};

int main()
{
  Foo f;

  f.Show = [&] () { std::cout << "Hello !" << std::endl; };
  f.Show();
}
于 2013-05-24T05:19:10.697 に答える
2

最も近いものは、ローカルの匿名クラスです。

#include <iostream>
class Foo
{
    public:
        virtual void Show() = 0;
};
int main() {
    struct : Foo {
        void Show() {
            std::cout << "Hello world\n";
        }
    } f;
    f.Show();
}
于 2013-05-24T05:18:43.737 に答える
2

代わりに、show という関数ポインタをクラスに格納できます。

class Foo
{
    public:
        void (*Show)();
        Foo()
        {
            Show = 0;
        }
}

次に、 Show != 0 の場合、それを呼び出すことができます (ユーザーが関数ポインターを割り当てた場合)。

于 2013-05-24T05:21:21.077 に答える
2

純粋仮想クラスはまったくインスタンス化できません

于 2013-05-24T05:18:42.313 に答える