1

Тема: Класи + Одинарне успадкування

Підкажіть як пофіксити помилку(а саме в Rectangle* tri = new Rectangle(a);) та чомусь виводить не правильний розрахунок хоча формули првильні.
Код:

#include<iostream>
#include<windows.h>
#include<math.h>
using namespace std;
class Shape2D
{
public:
    Shape2D();
    virtual ~Shape2D();
    virtual float Area() = 0;
    virtual float Perimeter() = 0;
    virtual void PrintMessage();
};
Shape2D::Shape2D()
{
    cout << "Конструктор  2D Форма" << endl;
}
Shape2D::~Shape2D()
{
    cout << "Деструктор   2D Форма" << endl;
}
void Shape2D::PrintMessage()
{
    cout << " Це 2D Форма";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class Triangle : public Shape2D
{
private:
    float S,P,p,r1, r2,r3;
public:
    ~Triangle();
    Triangle(float = 0);
    float Perimeter();
    float Area();
    void PrintMessage();
};
Triangle::Triangle(float rs) : r1(rs) , r2(rs), r3(rs)
{}
Triangle::~Triangle()
{}
float Triangle::Perimeter()
{
    P = r1 + r2 + r3;
    return P;
}
float Triangle::Area()
{
    p = (r1 + r2 + r3)/2;
    S=sqrt(p * (p - r1) * (p - r2) * (p - r3));
    return S;
}
void Triangle::PrintMessage()
{
    cout << "Тип фігури - Трикутник" << endl;
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


class Rectangle : public Shape2D
{
private:
    float P,S, s1,s2;
public:
    
    ~Rectangle();
    Rectangle(float = 0);
    float Perimeter();
    float Area();
    void PrintMessage();
};
Rectangle::Rectangle(float st) : s1(st),s2(st)
{}
Rectangle::~Rectangle()
{
    cout << "Прямокутник-деструктор " << endl;
}
float Rectangle::Perimeter()
{
    P = 2 * (s1 + s2);
    return P ;
}
float Rectangle::Area()
{
    S = s1 * s2;
    return S;
}
void Rectangle::PrintMessage()
{
    cout << "Тип фігури - Прямокутник";
}
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    float a;
    int i;
    while (1)
    {
        cout << endl << "Меню: " << endl
            << "1-Прямокутник" << endl
            << "2-Трикутник" << endl
            << "3-Вихiд:" << endl;
        cin >> i;
        switch (i)
        {
        case 1:
        {
                    cout << "Прямокутник:" << endl;
                    cout << "Введiть довжину ребра куба:" << endl;
                    cin >> a;
                    cin >> a;
                    cin >> a;
                    Rectangle* tri = new Rectangle(a);
                    cout << "Площа:" << tri->Area() << endl << "Периметер:" << tri->Perimeter() << endl;
                    tri->PrintMessage();
                    delete tri;
                    break;
        }
        case 2:
        {
            
            cout << "Трикутник:" << endl;
            cout << "Введiть сторони трикутника:" << endl;
            cin >> a;
            cin >> a;
            cin >> a;
            Triangle* rec = new Triangle(a);
            cout << endl << "Площа : " << rec->Area() << endl << "Периметер: " << rec->Perimeter() << endl;
            rec->PrintMessage();
            delete rec;
            break;
        }
        case 3:
            return 0;
        }
    }
    return 0;
}

Компілятор видає помилку : E0020 індифікатор  "tri" не определен та
                                           E0079 Потрібний специфікатор типа (Rectangle(a);    )

2

Re: Класи + Одинарне успадкування

kasia написав:
                    cout << "Введiть довжину ребра куба:" << endl;
                    Rectangle* tri = new Rectangle(a);
...
            Triangle* rec = new Triangle(a);

Це спеціально, щоб московитів заплутати, якщо код читати стануть? Я вас розчарую: вони не читають. Давайте змінним адекватні назви. І вирівняйте код.
Ви вводите одну сторону тричі, передаєте її параметром і записуєте у дві змінні класу. Це точно так треба було? Чи все ж різні сторони треба вводити і передавати? Або одну один раз?

kasia написав:
#include<math.h>

Це бібліотека мови C. У C++ аналогічна бібліотека зветься cmath.

kasia написав:
Компілятор видає помилку : E0020 індифікатор  "tri" не определен та
                                           E0079 Потрібний специфікатор типа (Rectangle(a);    )

У мене такої помилки не виникає, і не бачу причин, чому б вона могла тут виникнути. Припущу, що ви її виправили, а потім скопіювали сюди замість реальної помилки в останньому варіанті вашого коду помилку з попередньої компіляції.

3

Re: Класи + Одинарне успадкування

Так і справді помилки немає(я попробув в онлайн копіляторі все працю а візуал студії ні ).
Трохи поправив але всеодно вираховує погано?Можливо я не правильно передаю.

#include<iostream>
#include<windows.h>
#include<cmath>
using namespace std;
class Shape2D
{
public:
    Shape2D();
    virtual ~Shape2D();
    virtual float Area() = 0;
    virtual float Perimeter() = 0;
    virtual void PrintMessage();
};
Shape2D::Shape2D()
{
    cout << "Конструктор  2D Форма" << endl;
}
Shape2D::~Shape2D()
{
    cout << "Деструктор   2D Форма" << endl;
}
void Shape2D::PrintMessage()
{
    cout << " Це 2D Форма";
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class Triangle : public Shape2D
{
private:
    float S, P, p, r1, r2, r3;
public:
    ~Triangle();
    Triangle(float = 0);
    float Perimeter();
    float Area();
    void PrintMessage();
};
Triangle::Triangle(float rs) : r1(rs), r2(rs), r3(rs)
{}
Triangle::~Triangle()
{}
float Triangle::Perimeter()
{
    P = r1 + r2 + r3;
    return P;
}
float Triangle::Area()
{
    p = (r1 + r2 + r3) / 2;
    S = sqrt(p * (p - r1) * (p - r2) * (p - r3));
    return S;
}
void Triangle::PrintMessage()
{
    cout << "Тип фігури - Трикутник" << endl;
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


class Rectangle : public Shape2D
{
private:
    float P, S, s1, s2;
public:

    ~Rectangle();
    Rectangle(float = 0);
    float Perimeter();
    float Area();
    void PrintMessage();
};
Rectangle::Rectangle(float st) : s1(st), s2(st)
{}
Rectangle::~Rectangle()
{
    cout << "Прямокутник-деструктор " << endl;
}
float Rectangle::Perimeter()
{
    P = 2 * (s1 + s2);
    return P;
}
float Rectangle::Area()
{
    S = s1 * s2;
    return S;
}
void Rectangle::PrintMessage()
{
    cout << "Тип фігури - Прямокутник";
}
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    float a,a1,a2;
    int i;
    while (1)
    {
        cout << endl << "Меню: " << endl
            << "1-Прямокутник" << endl
            << "2-Трикутник" << endl
            << "3-Вихiд:" << endl;
        cin >> i;
        switch (i)
        {
        case 1:
        {
            cout << "Прямокутник:" << endl;
            cout << "Введiть сторони прямокутника:" << endl;
            cin >> a;
            cin >> a1;
            Rectangle* tri = new Rectangle(a);
            Rectangle* tri2 = new Rectangle(a1);
            cout << "Площа:" << tri->Area() <<tri2->Area() << endl << "Периметер:" << tri->Perimeter() << tri2->Perimeter() << endl;
            tri->PrintMessage();
            delete tri;
            break;
        }
        {
        case 2:

            cout << "Трикутник:" << endl;
            cout << "Введiть сторони трикутника:" << endl;
            cin >> a;
            cin >> a1;
            cin >> a2;
            Triangle* rec = new Triangle(a);
            Triangle* rec2 = new Triangle(a1);
            Triangle* rec3 = new Triangle(a2);
            cout << endl << "Площа : " << rec->Area() << rec2->Area() << rec3->Area() << endl << "Периметер: " << rec->Perimeter()<<rec2->Perimeter()<<rec3->Perimeter() << endl;
            rec->PrintMessage();
            delete rec;
            break;
        }
        case 3:
            return 0;
        }
    }
    return 0;
}

Підкажть як правильно передати або де це прочитати?

4

Re: Класи + Одинарне успадкування

Якщо вам потрібен 1 прямокутник з 2 різними сторонами, то вам треба передати 2 параметри в конструктор Rectangle, а не створювати два прямокутники.

5

Re: Класи + Одинарне успадкування

Ні мені не потрібно 2 прямокутники мені потрібно просто передати ті дані сторін в конструктор прямокутника і аналогічно для трикутника тільки проблема що в трикутника 3 сторони а в прямокутника 2 такий похожий спосіб як я зробив працював для 1 а мені потрібно для 2 і 3

6

Re: Класи + Одинарне успадкування

Ну то робіть для 2 і для 3. У чому ваша проблема, я не розумію. Якщо ви не знаєте, як зробити функцію, що приймає кілька параметрів, то вам точно не варто з класами працювати. Розв'яжіть краще пару задач на функції.