Инициализация членов в конструкторах

Может кто-нибудь сказать, пожалуйста, в этом коде, как объявить конструктор так, чтобы, когда объект был создан, высота инициализировалась с переданным значением, в то время как ширина всегда по умолчанию (2 в случае ниже).

class rectangle{
int width, height;
public:
//  rectangle(int w = 1, int h = 1): width(w), height(h){}
rectangle(int w = 2, int h=1): width(w) {height = h;}
int getW(){return width;}
int getH(){return height;}
};
int main()
{
rectangle r1(1);
rectangle r2(2);
rectangle r3(4);
rectangle r4(5);
cout << "w = " << r1.getW() <<" h = " << r1.getH() << endl;
cout << "w = " << r2.getW() <<" h = " << r2.getH() << endl;
cout << "w = " << r3.getW() <<" h = " << r3.getH() << endl;
cout << "w = " << r4.getW() <<" h = " << r4.getH() << endl;
}
Output with above code:
w = 1 h = 1
w = 2 h = 1
w = 4 h = 1
w = 5 h = 1

Может кто-нибудь сказать мне, как объявить конструктор так, чтобы вывод был как ниже (я хочу объявить объект только с одним параметром)?

w = 1 h = 1
w = 1 h = 2
w = 1 h = 4
w = 1 h = 5

0

Решение

Формулировка в вашем вопросе немного неясна. Звучит так, будто вы хотите полностью игнорировать аргумент ширины и просто задать ширину 2, в то время как высота необязательна и по умолчанию равна 1. Если это так, то вы можете просто сделать это:

rectangle(int, int h=1) :width(2), height(h) {}

Но мои навыки чтения мыслей говорят мне, что это не совсем то, что вы хотите (в основном потому, что это глупо). У меня есть догадка, что вы просто неправильно сформулировали свой вопрос, и что вы действительно хотите что-то вроде этого:

rectangle(int w, int h) :width(w), height(h) {} // handles 2 arguments
rectangle(int h=1) :width(2), height(h) {}      // handles 0 or 1 arguments

Эта конфигурация позволяет три подписи вызова.

  • 2 аргумента, первый идет в ширину, а второй в высоту.
  • 1 аргумент, который переходит в высоту, а ширина становится 2
  • 0 аргументов, ширина становится 2, высота становится 1
3

Другие решения

Других решений пока нет …