在Java中,我们可以在类似的方法中继承一个接口:
public Class myClass {
void myMethod() {
myInterface listener = new myInterface() {
public onClick() {
//code goes here
}
};
setListener(listener);
}
}
在C ++中;假设我有一个抽象类:
class myInterface {
public:
myInterface();
virtual ~myInterface() {};
virtual void onClick() = 0;
}
我尝试内联继承这个抽象类,如下所示,但它给出了错误:
myClass::myMethod() {
myInterface *listener;
listener = new myInterface() {
virtual void onClick() {
//some code here
}
};
setListener(listener);
delete listener;
}
我在互联网上找到的所有示例和教程都通过子类化来解释继承。但是我如何内联继承myClass :: myMethod()中的这个抽象类?
答案 0 :(得分:2)
您错过了没有秘密关键字或编译器功能。
C ++不是Java。 C ++人们使用不同的模式,习语和句法技巧来达到同样的效果。你需要阅读一本好书或教程才能得到它们。
答案 1 :(得分:0)
您可以使用C ++方式:
#include <boost/signals2.hpp>
class notifier {
public:
void notify(int i) {
handlers(i);
}
boost::signals2::connection add_listener(std::function<void(int)> listener) {
return handlers.connect(std::move(listener));
}
void remove_listener(boost::signals2::connection &connection) {
handlers.disconnect(connection);
}
private:
boost::signals2::signal<void(int)> handlers;
};
...
notifier n;
n.add_listener([](int i) {
std::cout << i << std::endl;
});
n.notify(100);
答案 2 :(得分:0)
如果您正在使用C ++ 11,则可以采用lambdas:
class myLambdaListener : public myInterface{
public:
myLambdaListener(const std::function<void()>& func) : mFunction(func){}
void onClick() override {if(mFunction) mFunction();}
private:
std::function<void()> mFunction;
}
myClass::myMethod() {
myInterface *listener;
listener = new myLambdaListener([](){
//some code here
});
setListener(listener);
//delete listener; - do not delete here
}