2016-06-12 4 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', но ваш будет конвертировать его в' + 5'. – aschepler

+0

@aschepler Я попробовал его с -5, но он работает. – specbk

ответ

2

Эти два примера обеспечивают такой же эффект в этом случае. Использование списка инициализации только (я бы поспорил) в целом более элегантно, потому что

  • Это означает, что элемент может быть константной
  • элемент инициализируется правильное значение сразу. Это может быть важно, если другой инициатор элемента или тело конструктора могут выбрасывать.

Однако, я бы сказал, что выражения с двумя тройными операторами (:) может быть трудно читать - я бы, вероятно, написал вспомогательную функцию, чтобы вернуть значение для инициализации rotation с.

+0

Думаю, я получил его, спасибо большое! – specbk

+0

Тернарные операторы особенно трудно читать, когда вы отформатируете их, так как ваш пробел сломан! Разумное использование пробелов является критическим. Но я полностью согласен с вами в написании вспомогательной функции. Я часто это делаю в своем собственном коде, но я всегда удивлялся этому, потому что я почти никогда не видел его в коде других людей. –

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