比方說,我有以下的回調類:如何創建抽象類的內聯實現?
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++不提供這種功能。 – Holt
使用std :: function。 –
您的Java版本看起來與您的C++版本非常相似,在概念上 –