首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >父类有26个构造函数重载。如何在没有copy+pasting 26过载的情况下,将一个小任务附加到所有的结构中?

父类有26个构造函数重载。如何在没有copy+pasting 26过载的情况下,将一个小任务附加到所有的结构中?
EN

Stack Overflow用户
提问于 2019-08-08 23:19:51
回答 2查看 105关注 0票数 3

我想从库中派生出一个类,以便具有方便的多态性功能。在本例中,父类是来自简历:垫子 4.1的OpenCV类。

在我的子类中,让我们称之为SpecialMat,我想添加一个简单的属性,无论cv::Mat的26个构造函数中哪个被调用,都可以在初始化过程中计算它。我想做的事情如下:

代码语言:javascript
复制
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?是否有一种创建构造函数的方法,如:

代码语言:javascript
复制
SpecialMat(AnyArgs args) : Mat(args), my_special_property(/*calculation goes here*/) {}

哪一个会调用父类的构造函数?

谢谢你的建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-08 23:30:37

您可以使用各种模板。

代码语言:javascript
复制
#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');
}

哥德波特

票数 3
EN

Stack Overflow用户

发布于 2019-08-12 01:20:27

您可以简单地定义一个构造函数,它以cv::Mat作为参数:

代码语言:javascript
复制
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:

代码语言:javascript
复制
void f(const SpecialMat& mat)
{
    // do some stuff
}

int main(void)
{
    cv::Mat m{};
    f(m);

    SpecialMat m2 = cv::Mat{};
    f(m2);

    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57421758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档