我画了这个例子:
#include <iostream>
#include <functional>
// ──────────────────────────────────────────────────────────────────────────────
using CallbackType = std::function<void(void*)>;
// ──────────────────────────────────────────────────────────────────────────────
class Karbofos {
CallbackType *Begin = nullptr;
CallbackType *End = nullptr;
public:
const std::string Name = "Карбофос";
void SetCallback(CallbackType *B, CallbackType *E) {
Begin = B;
End = E;
}
void Run() {
if (Begin) (*Begin)(this);
std::cout << "- Не отдам, слон - мой!\n";
if (End) (*End)(this);
}
};
// ──────────────────────────────────────────────────────────────────────────────
void Shef(void* i) {
std::cout << "- Стой, живодер " << ((Karbofos*)(i))->Name << "!\n";
}
// ──────────────────────────────────────────────────────────────────────────────
void Kollega(void* i) {
std::cout << "- " << ((Karbofos*)(i))->Name << ", ты немец и контрабандист!\n";
}
// ──────────────────────────────────────────────────────────────────────────────
int main() {
Karbofos Object;
CallbackType S = Shef;
CallbackType K = Kollega;
Object.SetCallback(&S,&K);
Object.Run();
return 0;
}
问题
是否有可能以某种方式不使用临时变量Chef,Kollega并立即将必要的引用传递给该方法SetCallback?
你真的需要指针
std::function吗?没有它们你也可以这样做:因为 创建对象
Shef并使用默认构造函数时,您可以在指定类型后使用运算符和空括号Kollega获取相似的对象(唯一的区别是它们的内存将在堆上而不是在堆栈上分配) 。new也就是说,线条改为简洁
我还要提请注意一个事实,因为 内存现在分配在堆上,您需要在使用对象后适当地清理它
delete,或者将其全部包装在智能指针中,如下所示:PS 为了使代码进入工作状态,我需要在两种情况下都在输出中添加
.c_str()after 。((Karbofos*)(i))->Name