2016-06-12 7 views
0

私はC++を初めて使っています。私はクラスやオブジェクトについて自分自身を練習しています。私は演算子のオーバーロードを含むプログラムを作りました。それは "明示的なコンストラクタ"を持っています。私はさまざまな値でそれを試してきましたが、それは正常に動作していますが、私の明示的なコンストラクタは、教師の答えとは少し異なります。 先生の答え:明示的なコンストラクタの特別な演算子C++

class Ventilator { 
int maxrot; 
int rot; 
int vert; 
bool horiz; 
public: 
explicit Ventilator(int maxrot=500, int rot=0, int vert=0, int horiz=false): maxrot(abs(maxrot)), 
    rot(rot<0?0:rot>abs(maxrot)?abs(maxrot):rot), vert(vert<-15||vert>15?0:vert), 
    horiz(horiz) { } 

鉱山は次のとおりです。両方の方法は全く同じ

class Ventillator{ 
int rotation; 
int vertikal; 
int maxrot; 
int horiz; 
public: 
explicit Ventillator(int rotation = 10, int maxrot=100, int vertikal = 11, bool horiz = true): 
    rotation(abs(rotation)), maxrot(abs(maxrot)), vertikal(abs(vertikal)), horiz(horiz){ 

    if (this->rotation > this->maxrot) this->rotation=this->maxrot; 
    if (this->rotation < 0) this->rotation = 0; 
    if (this->vertikal <= 15 && this->vertikal >=-15) this->vertikal=vertikal; 
    else 
     this->vertikal = 0; 
    } 

ませんか?コードをよりコンパクトにするために特別な演算子を使っているだけではありませんか?

+0

を教師のコードは 'vert'することができますあなたのものは '+ 5 'に変換されます。 – aschepler

+0

@aschepler私は-5でそれを試しましたが、それは同様に動作します。 – specbk

答えて

2

この場合、2つの例で同じ効果が得られます。これは、メンバーがメンバーがすぐに正しい値に初期化され

  • constのできることを意味し

    • ので、初期化リストを使用することでのみ、一般的に(私が主張するだろう)よりエレガントです。これは、別のメンバ初期化子またはコンストラクタ本体がスローできる場合に重要になります。

    しかし、私は2つの三項演算子を持つ式が(:)読みにくいことができることを主張するだろう - ?私はおそらくでrotationを初期化する値を返すためにヘルパー関数を書かれているでしょう。

    +0

    私はそれを持っていると思う、ありがとう! – specbk

    +0

    3進演算子は、スペースバーが壊れたように書式を設定すると、読みにくいです!慎重に空白を使用することが重要です。しかし、私はヘルパー機能を書くことに関して全くあなたに同意します。私はこれを自分のコードで頻繁に行いますが、他の人のコードではほとんど見られないので、私はいつもそれについて疑問に思っています。 –

    1

    いいえ、多少の違いはありますが、ただイデオロギーです。読みやすく、あなたは美しいコードを書くためにどのようにあなたの教師を教えることができているので、 あなたのソリューションは、より良いです:)

    また、あなたはこのようにそのコードを書き換える:

    #include <algorithm> 
    class Ventillator 
    { 
        int rotation; 
        int vertikal; 
        int maxrot; 
        int horiz; 
        inline int place_in_range(int num, int max, int min) 
        { 
         return ((std::max) (((std::min)(max, num)), min)); 
        } 
        inline bool is_in_range(int num, int max, int min) 
        { 
         return num <= max && min >= num; 
        } 
    
    public: 
        explicit Ventillator(int rotation = 10, int maxrot=100, int vertikal = 11, bool horiz = true): 
         rotation(place_in_range(abs(rotation), maxrot, 0)), maxrot(abs(maxrot)), vertikal((is_in_range(vertikal, 15, -15) ? abs(vertical) : 0)), horiz(horiz) 
        { 
        } 
    }; 
    
    +0

    ありがとう!!私はそれを試してみましょう!私は私のことが間違っていると思った、それは聞いてうれしいよ:)) – specbk

    関連する問題