我有一个抽象类文件
struct Abstract {
virtual bool preflightCheck(void) = 0;
std::function<void(Abstract *)> didIssueError;
virtual ~Abstract() {}
}
一个带有派生类的文件
class Derived : public Abstract {
bool preflightCheck(void) {
if(didIssueError != nullptr)
this->didIssueError(reinterpret_cast<MediaAssetAbstract*>(this));
}
}
然后我有一个名为didIssueError
的文件,称为lambda
bool testDerived(Abstract & derived) {
derived.preflightCheck();
derived.didIssueError = [&derived](Abstract * derived) {
std::cout << "error" << std::endl;
};
return true;
}
int main() {
auto derived = Derived();
assert(testDerived(derived));
return 0;
}
如果我取消选中nullptr
上的支票,程序将崩溃并显示以下消息
terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call
。
请问哪里有问题?从派生类到didIssueError
不兼容吗?
答案 0 :(得分:4)
std::function
和继承可以共存吗?
好的。
如果我取消选中
nullptr
上的支票,程序将崩溃并显示以下消息terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call
。请问哪里有问题?
问题是您在向didIssueError
分配功能之前先调用了它:
// call: derived.preflightCheck(); // assignment: derived.didIssueError = [&derived](Abstract * derived) { std::cout << "error" << std::endl; };
C ++是一种过程语言,而不是数据流语言。
P.S。这个:
this->didIssueError(reinterpret_cast<MediaAssetAbstract*>(this));
错了。