Qt项目调用Insta360 SDK时自定义StreamDelegate派生类新增方法报错
问题原因
你将TestStreamDelegate实例的智能指针赋值给了基类ins_camera::StreamDelegate类型的指针,编译器只会根据指针声明的类型识别可用成员,基类本身没有定义setupThread方法,因此触发编译报错。
解决方案
方案1:操作派生类指针后再转基类(最推荐)
在实例化后优先用派生类类型的指针调用自定义方法,再传给SDK的基类指针参数,无需任何类型转换,安全性最高:
// 先定义派生类类型的智能指针 auto test_delegate = std::make_shared<TestStreamDelegate>(); // 调用自定义方法 test_delegate->setupThread("TEST"); // 再传给SDK接口,会自动隐式转换为基类智能指针 camera->SetStreamDelegate(test_delegate);
方案2:基类指针强转为派生类指针
如果你的业务场景只能拿到基类类型的智能指针,可以用智能指针的强制转换操作:
- 确定基类指针一定指向
TestStreamDelegate实例时用std::static_pointer_cast,性能更高:
std::shared_ptr<ins_camera::StreamDelegate> delegate = std::make_shared<TestStreamDelegate>( ); auto test_delegate = std::static_pointer_cast<TestStreamDelegate>(delegate); test_delegate->setupThread("TEST"); camera->SetStreamDelegate(delegate);
- 不确定指针指向类型时用
std::dynamic_pointer_cast,转换失败会返回空指针,可以做异常判断:
std::shared_ptr<ins_camera::StreamDelegate> delegate = std::make_shared<TestStreamDelegate>( ); if (auto test_delegate = std::dynamic_pointer_cast<TestStreamDelegate>(delegate)) { test_delegate->setupThread("TEST"); } camera->SetStreamDelegate(delegate);
额外注意
你的TestStreamDelegate析构函数只关闭了file1_和file2_两个文件指针,filel_、filer_没有执行fclose,会造成资源泄漏,建议补充对应的关闭逻辑。
内容的提问来源于stack exchange,提问作者SladeCraven
相关产品推荐
相关产品推荐

