【发布时间】:2016-05-10 19:03:38
【问题描述】:
假设我有以下回调类:
class LogCallback {
public:
virtual void sendLog(std::string log) = 0;
virtual void setErrorCode(int code) = 0;
};
我有接受回调实现的引擎:
class Engine {
public:
Engine();
virtual ~Engine();
void setCallback(LogCallback* callback);
void start();
private:
LogCallback* logCallback;
};
现在我可以创建一个实现类了:
class OutLogger : public LogCallback {
void sendLog(std::string log) {
cout << "out: " << log << endl;
}
void setErrorCode(int code) {
sendLog("error code " + std::to_string(code));
}
};
并使用它:
int process() {
Engine engine;
OutLogger out;
engine.setCallback(&out);
engine.start();
}
在 C++11 中,我还可以使用匿名本地类:
int anonymous() {
Engine engine;
class : public LogCallback {
void sendLog(std::string log) {
cerr << "err: " << log << endl;
}
void setErrorCode(int code) {
sendLog("error code " + std::to_string(code));
}
} err;
engine.setCallback(&err);
engine.start();
}
现在有一个问题:我可以在没有显式匿名类的情况下在函数调用中做同样的事情吗?
如果是 Java,我会这样做:
public class AnonymousClass {
private abstract class LogCallback {
abstract void sendLog(String log);
abstract void setErrorCode(int code);
}
private class Engine {
public void setCallback(LogCallback callback) {
this.callback = callback;
}
public void start() {
if (callback != null) {
callback.sendLog("Starting...");
}
}
private LogCallback callback;
}
public void process() {
Engine engine = new Engine();
engine.setCallback(new LogCallback() {
@Override
void sendLog(String log) {
System.out.println("out: " + log);
}
@Override
void setErrorCode(int code) {
sendLog("error code " + code);
}
});
engine.start();
}
public static void main(String[] args) {
AnonymousClass example = new AnonymousClass();
example.process();
}
}
【问题讨论】:
-
简短的回答是不,你不能。,据我所知,c++ 不提供这样的功能。
-
使用 std::function.
-
您的 Java 版本在概念上看起来与您的 C++ 版本非常相似