C++ 当声明/参数相同时,如何重载构造函数/函数?

C++ 当声明/参数相同时,如何重载构造函数/函数?,c++,constructor-overloading,C++,Constructor Overloading,我想创建一个类来管理矩阵,但我遇到了构造函数的问题。 目的是找到调用矩阵对象的构造函数的最短方法,知道一些构造函数的头与保持清除的头相同。 这就是我想要得到的: Matrix id; // create identity matrix Matrix scale(x, y, z); // create directly a scale matrix Matrix translation(x, y, z) // create a translation 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,所以我不能重载构造函数,我看到的唯一一件事就是使用模板,但仅在那些特殊情况下,我不知道该怎么做

解决方案

最后,我决定创建一个抽象类,如下所示:

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 id;
Mat::Scale scale(2, 2, 2);
// ...
所有类都将被定义到
\u Mat
中,而另一个类仅对其构造函数有用

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

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 id;
Mat::Scale scale(2, 2, 2);
// ...

您有以下选项:

  • 在构造函数中引入不同类型的不同伪参数来区分重载。这是黑客,我不推荐它

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

  • 将构造函数设置为私有,并引入
    publicstatic
    factory方法,这些方法具有很好的长名称,可以清楚地指示它们的作用。(无过载。)

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

    您正在寻找标签发送。您可以在标准库中看到它的使用,例如在的重载中

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

    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};
    }
    

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

    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);
    

    听起来你应该考虑继承。但是类是一样的,只是构造器发生了变化,创建“MatrixScale”和“MatrixScale”是一样的,只是构造器不同。请澄清你的问题,因为不清楚你想要什么
    Matrix
    Matrix
    是不同的类型,这里不会出现过载。好了,现在你想要什么就清楚了。但你们完全误解了缢蛏的概念。构造函数是一种创建类矩阵的方法,而不是缩放或转换。如果要创建比例(或连接到矩阵的任何其他对象),此处有多个选项。其中一些是迈克·纳基斯(Mike Nakis)在回答中提到的。如果你不需要动态创建矩阵,我也会选择构建器方法,如他的回答中所示。但我们发送一个新参数只是为了指定我们要在这个解决方案中使用什么?否?@Zone31是,这就是我们要做的。如果不为构造函数的主体添加一个无用的参数,就无法调用构造函数?@Zone31它与其他参数一样包含大量信息,即它们应该如何解释。但如果这真的让你不舒服,你可以用工厂函数代替。他们也很好。谢谢你,你给了我一个参考接线员的主意