2

double P1C++ではdouble P2、5 つのパラメーターを持つオブジェクトがある場合、次のような方法でコンストラクターを使用することはdouble P3可能double P4ですboolean P5か?

MyObject (double param1, double param2, true)の場合、param1 が P1 に割り当てられ、param2 が P2 に割り当てられ、P3 と P4 が 0 に割り当てられ、P5 が true に割り当てられます。

もしそうなら:

MyObject (double param1, double param2, false)の場合、param1 は P3 に割り当てられ、param2 は P4 に割り当てられ、P1 と P2 は 0 に割り当てられ、P5 は false に割り当てられますか?

つまり、使用されるコンストラクターは、渡された最後のパラメーターの値に基づいていますか?

4

5 に答える 5

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 を持たないほうがよいでしょう。なぜなら、関数が読みにくくなるためです。代わりに、機能を 2 つに分割して、機能が互いに区別されるようにすることをお勧めします。

PrintAllHtml(bool b) 未満と言う

PrintHtmlHead() PrintHtmlBody()

後で変更しやすくなる場合があります。

于 2013-10-08T03:55:07.867 に答える
1

はい、異なる署名を持つ複数のコンストラクターと、渡された引数に基づいて異なる動作をする 1 つのコンストラクターを持つことができます。あまりクレイジーになりたくないかもしれませんが、コンストラクターが奇妙な動作をすると、クラスを使用する人々が苦労するからです。

于 2013-10-08T03:55:43.213 に答える
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;
    }
}
于 2013-10-08T03:57:12.010 に答える
1

truefalseが常に定数である場合 (つまり、ブール変数ではなく、常に or のtrueいずれかを渡す場合)、テンプレートと特殊化を使用してこれを行うことができます。率直に言って、私はそれをアドバイスするのに苦労しています。false

仕事をするための最も簡単な方法はif、ctorでステートメントを使用することです。

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

しかし、率直に言って、私は一歩下がって、あなたがしていることについてもっとよく考えてみようと思います. Boolean をパラメーターとして渡すことは、一般的には悪い考えです。なぜなら、意味を伝えるのMyObject(1, 2, true);MyObject(2, 3, false);うまくいかないからです。あなたの場合、どちらかが何をするかの手がかりを得るために ctor を読む必要があるという点で、通常よりもさらに意味がないように見えます。

要約: はい、これは可能です。

于 2013-10-08T04:06:45.827 に答える
1

オプションの別の例を次に示します。2 つを変更または提供する代わりに、それはやりたいことではないため、コンストラクターで展開されたコードを使用する代わりに、次のことを試してください。

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

私にとってこれは簡単で、少しきれいです-もちろん意見です。コメントで明らかなことを指摘して申し訳ありません;)

于 2013-10-08T04:45:49.260 に答える