我正在使用一个继承自opencv Rect的A类。只是添加了一些我想在执行过程中跟踪的变量。
class A: public Rect { //code, constructors... }
我想使用opencv方法detectMultiScale
,它需要一个空的vector<Rect>
,并用预期的输出填充它。
如何传递一个继承对象的空向量,就是来自Rect的vector<A>
并期望捕获方法内的基类? (我在这一点上理解该方法是一个黑盒子,我不想编译opencv来重新声明一些东西)。
答案 0 :(得分:1)
我担心自己不会工作,你必须与std::vector<Rect*>
合作 - 直觉上,这会在sizeof(Rect) != sizeof(A)
时出现,所以即使你的索引也会失败,对于std::vector<Rect>
,更不用说类布局了。指针,或者,如果您有一组固定的类型,您可以尝试变体和访问者。
编辑:如果您的用例(detectMultiScale
)不允许您传递vector<std::Rect*>
,您可以从各种装饰器访问者实现中进行选择。在这种情况下,您必须放弃直接继承。说出一些:
拥有std::vector<Rect>
和std::vector<ARectV>
。 ARectV
包含您在Rect
中无法找到的其他字段。
Rect
添加引用。在这种情况下,构造函数将填充Rect;或ARectV
方法可能需要(可能是const)Rect&
,在这种情况下,您的构造函数不需要存储它如果所有其他方法都失败了,请使用静态std::map<Rect*, ARectV> sARectV
。这将是较慢的并且需要手动插入/删除(可能在sARectV的构造函数/析构函数中,前者采用 - 可能是const - Rect*
或Rect&
),但允许您编写:{{1} }。当然,它还允许标准表示法,即sARectV[&rect].yourfunction()
- 但您可能无法将Rect rect; ARectV rectv(rect); rectv.yourfunction();
传递给应该rv
或Rect*
的回调。如果按价值计算Rect&
,则表示运气不佳。
答案 1 :(得分:1)
如何传递一个继承对象的空向量,它是来自Rect的向量并期望捕获方法内的基类?
这是不可能的。该函数需要Rect
个对象的向量,因此这是您必须传递的对象。
如果你想要一个A
的向量,那么你可以编写一个构造函数A(Rect)
,它接受一个基类的实例作为参数,并相应地初始化基础子对象。然后编写一个转换获取的Rect
实例的循环。