构造函数基于最后一个参数的值?

时间:2013-10-08 03:49:48

标签: c++ constructor

在C ++中,是否有可能以这样的方式构建一个构造函数,比如我有一个包含5个参数的对象:double P1double P2double P3,{{1 }},double P4,我可以让我的构造函数以这样的方式工作,如果我说:

boolean P5,然后将param1分配给P1,将param2分配给P2,将P3和P4分配给0,将P5分配给true

如果我这样做:

MyObject (double param1, double param2, true),然后param1分配给P3,param2分配给P4,P1和P2分配给0,P5分配给假?

即,使用的构造函数基于传入的最后一个参数的值?

5 个答案:

答案 0 :(得分:2)

您可以拥有多个构造函数

C(double P1, double P2, double P3, double P4) 
: m_P1(P1), m_P2(P2), m_P3(0),m_P4(0), m_P5(0) { ; }

C(double P1, double P2) 
: m_P3(P1), m_P4(P2) {;}
...

通常使用函数最好不要使用bool来确定行为,因为它会使函数更难以阅读,而是最好将功能分成两部分,以便功能彼此不同。 / p>

PrintAllHtml(bool b)小于

PrintHtmlHead() PrintHtmlBody()

以后可能更容易修改。

答案 1 :(得分:1)

是的,您可以拥有多个具有不同签名的构造函数,以及一个基于传递的参数行为不同的构造函数。虽然你可能不想太疯狂,但如果构造函数表现得很奇怪,那么使用你的类的人会很难。

答案 2 :(得分:1)

在构造函数中只有一个if语句

MyObject(double par1, double par2, bool par3)
{
    this->p5 = par3;
    if(par3)
    {
        this->p1 = par1;
        this->p2 = par2
        this->p3 = 0;
        this->p4 = 0;
    }
    else
    {
        this->p1 = 0;
        this->p2 = 0;
        this->p3 = par1;
        this->p4 = par2;
    }
}

答案 3 :(得分:1)

如果truefalse始终是常量(即,您总是要通过truefalse不是一些布尔变量),然后你可以使用模板和专业化来做到这一点。坦率地说,我很难建议。

对我来说,最直接的工作方式就是在ctor中使用if语句:

MyObject(double P1, double P2, bool b) { 
    if (b) {
        P1_ = P1;
        P2_ = P2;
        P3_ = P4_ = 0.0;
        P5 = true;
    }
    else {
        P3_ = P1;
        P4_ = P2;
        P1_ = P2_ = 0.0;
        P5 = false;
    }
}

但是,我认为我会退后一步,更加努力地思考你在做什么。将布尔值作为参数传递通常是一个坏主意,因为它在传达意义方面做得很差 - 即使充其量,MyObject(1, 2, true);MyObject(2, 3, false);的含义也不明显。在你的情况下,它看起来甚至没有平常那么有意义,以至于你需要阅读ctor以获得任何一个人的任何线索。

总结:是的,这是可能的 - 但我真的怀疑这是个好主意。

答案 4 :(得分:1)

这是另一种选择。而不是更改或提供两个,因为这不是你想要做的,而不是在构造函数中使用扩展代码尝试:

    MyObject(double param1, double param2, bool param3) {
        P5 = param3;
        if (P5)
            defaultConstructor(param1, param2, 0.0, 0.0);
        else
            defaultConstructor(0.0, 0.0, param1, param2);
    }

    void defaultConstructor(double param1, double param2, double param3, double param4) {
        P1 = param1;
        P2 = param2;
        P3 = param3;
        P4 = param4;
    }
};

这对我来说很简单,有点清洁 - 当然是意见。 很抱歉在评论中指出了明显的内容;)