【发布时间】:2019-02-12 17:30:20
【问题描述】:
我正在尝试在 c++ 中实现可可的委托模式。
我尝试在 imagepicker 示例中模拟可可委托模式,如下所示。但是,我不确定这是在 C++ 中实现的正确方法,并且想知道是否有人有更好的想法。我也注意到 我提出的这个实现与传统的 c++ 委托(?)(see here)无关。我什至不确定上一个链接中的委托实际上是委托模式(我认为它只是函数指针)。
class ImagePickerControllerDelegate { // defined as protocol in swift
public:
virtual void ImagePickerFinished() = 0;
};
class ImagePickerController {
public:
ImagePickerControllerDelegate * delegate;
private:
void findImageDirectory() {}
void checkUserPermission() {}
void loadImage(char* image_name) {}
void andDoOtherThings() {}
public:
void Run() {
// doing long stuff here ..
findImageDirectory();
checkUserPermission();
loadImage("lena");
andDoOtherThings();
// done, notify
delegate->ImagePickerFinished();
// other clean-up etc.
}
};
class MainViewController: ImagePickerControllerDelegate {
ImagePickerController ImagePicker = ImagePickerController();
public:
MainViewController() {
this->ImagePicker.delegate = this;
}
void UserClicked() {
ImagePicker.Run();
}
virtual void ImagePickerFinished() {
std::cout << "image picker finished..";
}
};
简而言之,我需要在 C++ 中简单而美观地实现可可委托模式的好建议。我真的不喜欢丑陋的 STL 模板的东西,所以请不要提供使用它的建议/示例。
【问题讨论】:
-
我想在实现委托接口时你应该做
class MainViewController: public ImagePickerControllerDelegate,而不是class MainViewController: ImagePickerControllerDelegate -
实现委托的最佳方式是使用纯虚函数,看stackoverflow.com/questions/3130588/…
-
您可以将
std::function与std::bind结合使用(或捕获lambda)来摆脱抽象类和继承的需要,仍然可以获得一个优雅的解决方案。但是,std::function来自 STL,并且确实使用了模板。