2017-05-28 127 views
3

我想创建一个类来管理矩阵,我遇到了构造函数的问题。 目标是找到调用Matrix objet的构造函数的最简单方法,因为它知道某些构造函数具有与保持清晰相同的头文件。 这是我所尝试的想法:如何在声明/参数相同时重载构造函数/函数?

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其实如此我不能超载的构造,我唯一看到的是使用的模板,但只对那些特殊情况则我不知道该怎么办。

解决方案

最后,我决定做一个抽象类是这样的:

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和其他类将只是有用的为他们构造函数(S)

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

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

听起来像是你应该看的继承。 –

+1

但类将是相同的,它是正确的构造函数的变化,它是奇怪的创建例如“MatrixScale”,这是相同的“矩阵”只是一个不同的构造函数 – Zone31

+0

请澄清你的问题,因为它不清楚你想要什么。 '矩阵'和'矩阵'是不同的类型,在这里不会发生过载。 – Logman

回答

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

谢谢你,你给了我一个关于引用操作符的想法 – Zone31

2

您有以下选择:

  1. 介绍的构造不同类型的不同虚拟参数的重载区分。这是hacky,我不会推荐它。

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

  3. 让你的构造函数保密并引入public static工厂方法,它们有很长很长的名字,清楚地表明他们做了什么。 (没有超载。)

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

4

您正在寻找tag分派。您可以看到它在标准库中使用,例如在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}; 
} 
+0

但是我们发送一个新参数来指定我们想要使用的解决方案不是? – Zone31

+0

@ Zone31是的,这就是我们所做的。 – Quentin

+0

没有一种方法来调用构造函数,而无需为构造函数的主体添加无用参数? – Zone31