考虑以下界面:
class MyInterface
{
virtual bool test(void * param) = 0;
}
可以做这样的事情来实现界面吗?
MyInterfacemyInterface = new MyInterface()
{
bool test(void * param)
{
return true;
}
}
myClass.setInterface(myInterface);
----- OR -----
myClass.setInterface( new MyInterface()
{
bool test(void * param)
{
return true;
}
} );
PS:此方法是用Java完成的。想知道C ++中类似的东西。
答案 0 :(得分:2)
最接近内联接口实现的java等价物是将私有类放入编译单元:
#include "MyInterface.hpp"
namespace {
struct MyInterfaceImpl : public MyInterface {
virtual bool test(void * param)
{
return true;
}
};
}
并在此文件的其他位置使用它(例如,从堆栈本地实例)。
答案 1 :(得分:2)
大多数情况下,这种模式在Java中用于事件处理/回调目的。如果它接近你的用例,那么考虑这样的事情:
class Widget {
std::function<void()> _callback;
void setCallback(std::function<void()> callback) { _callback = callback; }
void fireCallback() { if(_callback) _callback(); }
}
在遥远的星系中:
int main() {
Widget *pw = new Widget();
auto callbackFunction = []() { alert("called back!"); } // C++ lambda
pw->setCallback( callbackFunction );
....
}
如果需要,Widget实例可能会决定调用其fireCallback方法,因此您将在屏幕上看到alert(“call back!”)。
答案 2 :(得分:1)
我假设您想要做类似于Java中所做的事情并创建某种仅在一个地方使用的匿名类。
这在C ++中是不可能的,就像它在Java中一样。 你可以做的类似的东西是你的'接口'(尽管它不再是那个)使用lambdas,它是在你实例化类的那一刻指定的。这不是你想要的,并不是非常惯用的C ++,但可以做到。
答案 3 :(得分:1)
严格来说,C ++中没有这样的语义。如果要将接口传递给函数,可以将指针或引用作为参数,并在单独的类中实现该接口。
您将拥有以下成员函数之一(跟随您的姓名)
myClass::setInterface(MyInterface* ptr);
//or
myClass::setInterface(MyInterface& ref);
然后执行
class MyInterfaceImpl : public MyInterface{
//Stuff
}
然后,您可以将指针传递给MyInterfaceImpl
到setInterface
,但是您无法在运行中定义并将其传递给功能
编辑:如果您想要接近这种行为,请考虑πάνταῥεῖ回答,或者在创建实例之前实现该类并将其传递给函数,尽管这在我的经历中非常不寻常,并用本地类定义混淆代码)