Конструктор по умолчанию

 
0
 
C++
ava
ioManip | 01.10.2013, 04:37
Привет! Задание такое: Организовать класс прямоугольник, содержащий методы нахождения площади, периметра, длин диагоналей. Класс должен содержать не менее двух конструкторов - по умолчанию и с параметроми.


#include <iostream>
#include <cmath>

using namespace std;

class Rectangle
{
public:
    Rectangle(int A, int B);
    Rectangle();
    ~Rectangle() {}
    void SetSideAB(int sideA, int sideB);
    int GetArea();
    int GetPerimiter();
    int GetDiagonal(); 
    
private:
    int a, b;
};

Rectangle::Rectangle(int A, int B)
{
    SetSideAB(A, B);
}

Rectangle::Rectangle()
{
    cout << "Введите A: ";
    cin >> a;
    cout << "Ведите B: ";
    cin >> b;
}

void Rectangle::SetSideAB(int sideA, int sideB)
{
    a = sideA;
    b = sideB;
}

int Rectangle::GetArea()
{
    int resultArea = a * b;
    
    cout << "Площадь прямоугольника: " << resultArea << endl;
    
    return resultArea;
}

int Rectangle::GetPerimiter()
{
   int resultPerimetr = 2 * (a + b);
   
   cout << "Периметр прямоугольника: " << resultPerimetr << endl;
   
   return resultPerimetr;
}

int Rectangle::GetDiagonal()
{
    int resultDiagonal = sqrt(a * a + b * b);
    
    cout << "Длина диагоналей прямоугольника: " << resultDiagonal << endl;

    return resultDiagonal;    
}

int main() 
{
    Rectangle recOne(5, 6);
    Rectangle recTwo();

    recOne.GetArea();
    recOne.GetPerimiter();
    recOne.GetDiagonal();
    
    recTwo.GetArea();
    recTwo.GetPerimiter();
    recTwo.GetDiagonal();

    return 0;
}


Ошибки выдает такие :

запрос элемента «GetArea» в «recTwo», имеющего не классовый тип «Rectangle()»
запрос элемента «GetPerimiter» в «recTwo», имеющего не классовый тип «Rectangle()»
запрос элемента «GetDiagonal» в «recTwo», имеющего не классовый тип «Rectangle()»


Что я делаю не так? Не понимаю!
Comments (8)
ava
maxim1000 | 01.10.2013, 07:43 #
Цитата (ioManip @  1.10.2013,  03:37 findReferencedText)
Rectangle recTwo();

надо просто "Rectangle recTwo;"

в C++ такой синтаксис подходит и для создания объекта, и для объявления функции без аргументов, в таких случаях он выбирает объявление.
ava
azesmcar | 01.10.2013, 11:49 #
Цитата (maxim1000 @  1.10.2013,  07:43 findReferencedText)
надо просто "Rectangle recTwo;"

В данном случае это не имеет значения, так-как в конструкторе вызывается cin (кстати плохая идея), но справедливости ради стоит заметить, что результат этих двух вызовов все таки разный.
ava
akizelokro | 01.10.2013, 12:58 #
Цитата


Класс должен содержать не менее двух конструкторов - по умолчанию и с параметроми.



потому что надо вытащить работу с потоками из конструктора по умолчанию. А в самом конструкторе задай длины сторон по умолчанию 1 и 1, например).
А то у тебя получается очередной лоигческий конфликт. Ты создал конструктор по умолчанию, а, он, вообще-то, логически рассуждая, даже очень "не по умолчанию"

И эта..
Недавно один критик современного развития С++ сунул мне в нос стандарт Гуглей, в котором они вообще рекомендуют не применять потоки (но это ладно, людей миллионы, не меньше и мнений). Но суть в том, что у тебя логический диссонанс. 
ava
volatile | 01.10.2013, 23:45 #
Цитата (maxim1000 @  1.10.2013,  07:43 findReferencedText)
надо просто "Rectangle recTwo;"

Вот этот первый ответ верный.
все остальные ответы к существу проблемы не относятся.

Цитата (azesmcar @  1.10.2013,  11:49 findReferencedText)
В данном случае это не имеет значения

azesmcar, внимательней посмотрите. вы неправы.
ava
maxim1000 | 02.10.2013, 09:05 #
Если я не ошибаюсь, azesmcar имеет в виду, что если бы такой синтаксис работал, он иногда бы делал несколько другое.

Причина - несколько другое поведение очень похожего кода: T x=T();

Вот пример кода (пробовать в Release-конфигурации):

#include <iostream>
struct S
{
    int x;
};
int main()
{
    S s1=S();//x=0
    S s2;//x=garbage
    return 0;
}


Но как только появляется конструктор по умолчанию (написаный человеком, а не сгенерированный компилятором), отличия пропадают.
ava
ioManip | 02.10.2013, 10:09 #
maxim1000,
Цитата (maxim1000 @  1.10.2013,  07:43 findReferencedText)
надо просто "Rectangle recTwo;"

Действительно! Заработало! Спасибо!

azesmcar,
Цитата (azesmcar @  1.10.2013,  11:49 findReferencedText)
вызывается cin (кстати плохая идея)

А как по хорошему(по правилам) будет?

UPD упппс, akizelokro, я увидел как нужно!
ava
azesmcar | 02.10.2013, 10:48 #
Цитата (maxim1000 @  2.10.2013,  09:05 findReferencedText)
он иногда бы делал несколько другое

 smile 
просто не обратил внимания на конструкторы smile
это только для pod-структур и агрегатов smile 

Цитата (ioManip @  2.10.2013,  10:09 findReferencedText)
А как по хорошему(по правилам) будет?

прочитать снаружи и передать в конструктор.
у тебя он уже есть
Цитата


Rectangle(int A, int B);


а конструктор по умолчанию пусть инициализирует нулями, ну или вообще убери его, если инициализация по умолчанию не имеет смысла.
ava
ioManip | 02.10.2013, 10:59 #
Спастбо Всем! smile 
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit