好的,我有一个愚蠢的问题,但我认为如果有办法可能会有用。
无论如何,假设我有以下课程:
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
答案 0 :(得分:4)
有办法吗?
不,如果它具有纯虚拟成员函数,则无法实例化Foo
。
我只需要知道是否可以做类似的事情。
这取决于你的意思。如果你忘记了纯虚拟,你可以给Foo::Show()
一个实现,例如,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(); };
答案 1 :(得分: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();
}
答案 2 :(得分:2)
纯虚拟类无法实例化
答案 3 :(得分:2)
你最接近的是一个本地匿名类:
#include <iostream>
class Foo
{
public:
virtual void Show() = 0;
};
int main() {
struct : Foo {
void Show() {
std::cout << "Hello world\n";
}
} f;
f.Show();
}
答案 4 :(得分:2)
您可以在类中存储名为show的函数指针。
class Foo
{
public:
void (*Show)();
Foo()
{
Show = 0;
}
}
然后如果Show!= 0你可以调用它(也就是说,如果用户为它指定了一个函数指针)。