如何在声明/参数相同时重载构造函数/函数?

时间:2017-05-28 22:10:24

标签: c++ constructor-overloading

我想创建一个类来管理矩阵,我遇到了构造函数的问题。 目的是找到调用Matrix对象的构造函数的最短方法,因为知道某些构造函数具有与保持清晰相同的头。 这就是我想要得到的想法:

Matrix id; // create identity matrix
Matrix scale(x, y, z); // create directly a scale matrix
Matrix translation(x, y, z) // create a translation matrix
...

这里,所有参数都是float s所以我不能重载构造函数,我唯一看到的是使用模板,但仅针对那些特殊情况,我不知道该怎么做。< / p>

解决方案

最后我决定制作一个这样的抽象类:

class _Mat
{
    public :
        virtual ~_Mat(void) = 0;

        // ...
}

class Mat : public _Mat
{
    public :
        Mat(void);
        virtual ~Mat(void);

        class Scale : public _Mat
        {
            public :
                Scale(float x, float y, float z);
                vitual ~Scale(void);

                // ...
        }

        // ...
}

所有将被定义为_Mat,而另一个类将对其构造函数有用

最后,我们可以调用这样的构造函数:

Mat id;
Mat::Scale scale(2, 2, 2);
// ...

3 个答案:

答案 0 :(得分:4)

您正在寻找标签调度。您可以在标准库中看到它,例如在std::pair's constructor的重载中。

您只需声明一个“标记”结构,用于指导重载解析:

struct translation_matrix_tag_t {} static translation_matrix_tag;
struct scale_matrix_tag_t {} static scale_matrix_tag;

然后重载你的构造函数:

struct Matrix {

    Matrix(translation_matrix_tag_t, float, float, float);
    Matrix(scale_matrix_tag_t, float, float, float);

    // ...
};

然后你可以像这样使用它:

void foo() {
    Matrix m1{translation_matrix_tag, x, y, z};
    Matrix m2{scale_matrix_tag, x, y, z};
}

答案 1 :(得分:4)

您可以保持简单并使用静态成员函数:

struct Matrix
{
    // ...

    static Matrix Translate(float x, float y, float z) {/*...*/}
    static Matrix Scale(float x, float y, float z) {/*...*/}
};

// ...

Matrix m = Matrix::Scale(1,2,3);

答案 2 :(得分:2)

您有以下选择:

  1. 在构造函数中引入不同类型的不同虚拟参数,以区分重载。这很黑,我不推荐它。

  2. 使用继承。创建不同的子类,其中每个子类都以其构造函数提供的功能命名。

  3. 将您的构造函数设为私有,并引入public static工厂方法,这些方法具有良好的长名称,可清楚地表明它们的作用。 (没有超载。)

  4. 就个人而言,我会选择第三种选择。