我想从库中派生出一个类,以便具有方便的多态性功能。在本例中,父类是来自简历:垫子 4.1的OpenCV类。
在我的子类中,让我们称之为SpecialMat,我想添加一个简单的属性,无论cv::Mat的26个构造函数中哪个被调用,都可以在初始化过程中计算它。我想做的事情如下:
class SpecialMat : public cv::Mat
{
private:
float my_special_property;
void thisFunctionAlwaysCalledAfterConstructor() {
//some constant calculation we can always do at initialization
my_special_property = this.known_property * this.other_known_property;
}
};有没有办法做到这样的事情,而不超载所有26个构造函数的cv::Mat?是否有一种创建构造函数的方法,如:
SpecialMat(AnyArgs args) : Mat(args), my_special_property(/*calculation goes here*/) {}哪一个会调用父类的构造函数?
谢谢你的建议!
发布于 2019-08-08 23:30:37
您可以使用各种模板。
#include <iostream>
#include <utility>
class Foo {
public:
Foo(int i) {}
Foo(double d, int i) {}
Foo(const Foo& f) {}
Foo(char&& c) {}
};
class Bar : public Foo {
public:
template<typename ...Args>
Bar(Args&&... args)
:Foo(std::forward<Args>(args)...) {
ExtraFunc();
}
private:
void ExtraFunc() {
std::cout << "Calculating extra value\n";
}
};
void Test() {
int i = 0;
double d = 0;
Foo f{i};
Bar{i};
Bar{d, i};
Bar{f};
Bar('a');
}发布于 2019-08-12 01:20:27
您可以简单地定义一个构造函数,它以cv::Mat作为参数:
class SpecialMat : public cv::Mat
{
public:
SpecialMat(const cv::Mat& mat) :
Mat{ mat }
{
special_func();
}
// Optional, can perform better in some cases. See move semantics if
// you're not aware of the concept.
SpecialMat(cv::Mat&& mat) :
Mat{ std::move(mat) }
{
special_func();
}
private:
void special_func(void)
{
}
};这样,cv::Mat类可以隐式转换为SimpleMat:
void f(const SpecialMat& mat)
{
// do some stuff
}
int main(void)
{
cv::Mat m{};
f(m);
SpecialMat m2 = cv::Mat{};
f(m2);
return 0;
}https://stackoverflow.com/questions/57421758
复制相似问题