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()一个实现,比如 an std::function<void()>,你可以从一个 lambda 表达式、另一个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

纯虚类根本无法实例化

于 2013-05-24T05:18:42.313 回答
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 回答