首页 > 解决方案 > 如何根据 C++ 中的参数初始化类的成员?

问题描述

我想实现一个使用 N 维向量的类(从数学的角度来看)。我正在使用 opencv 库中的 Vec 对象,它们的签名如下所示:该向量内的元素数量在Vec<typename _Tp, int cn>哪里。我必须为参数cn提供一个常量。cn

我希望我的班级看起来像这样:

class MyClass
{
private:
    Vec<float, dim> m_center;
    vector<Vec<float, dim>> m_points;
// ...
}

我希望能够进行动态初始化dim,即创建一个MyClass对象,将其dim设置为我想要的任何数字。如何在 C++ 中正确解决这个问题?

标签: c++classgenericsinitialization

解决方案


template <typename T, int N=9>
class Vec
{
public:
    Vec()
    {
        //auto deleter = [](T* t) { delete[] t; };
        //unique_ptr <T, decltype(deleter)> test(new T[N], deleter); //customized deleter omitted
        t = new T[N];
    }
    Vec(const Vec &v)
    {
        sz = v.sz;
        t = new T[sz];
    }
    string getType()
    {
        return typeid(T).name();
    }
    int getSize()
    {
        return sz;
    }
    ~Vec()
    {
        delete [] t;
    }

private:
    T *t;
    int sz = N;
};

template<int dim = 1>
class MyClass
{
public:
    MyClass()
    {
        m_points.resize(2);
    }
    Vec<float, dim> getCenter()
    {
        return m_center;
    }

    vector<Vec<float, dim>> getPoints()
    {
        return m_points;
    }

private:
    Vec<float, dim> m_center;
    vector<Vec<float, dim>> m_points;
};

测试代码:

int main()
{
    MyClass<10> my;

    cout << "center size = " << my.getCenter().getSize() << endl;
    cout << "center type =" << my.getCenter().getType().c_str() << endl;

    cout << "points size" << my.getPoints().size() << endl;

    cout << "first point size = " << my.getPoints()[0].getSize() << endl;
    cout << "first point type =" << my.getPoints()[0].getType().c_str() << endl;

    std::cout << "Hello World!\n"; 
}

输出:

center size = 10
center type =float
points size2
first point size = 10
first point type =float
Hello World!

推荐阅读