Форум программистов, компьютерный форум CyberForum.ru

Интерфейсы в классах - C++

Восстановить пароль Регистрация
 
ihavesoul
1 / 1 / 0
Регистрация: 18.11.2015
Сообщений: 44
28.03.2016, 14:24     Интерфейсы в классах #1
Все добрый день.
Такое вот задание :
Реализовать все указанные интерфейсы для классов :
а)Отрезок
б)Трапеция
Функционал системы:
// - Динамическое добавление фигур пользователем.
// - Отобразить все фигуры.
// - Общая площадь всех фигур.
// - Общий периметр всех фигур.
// - Центр масс всей системы.
// - Память, занимаемая всеми экземплярами классов.
// - Сравнение фигур между собой по массе.

Я сделал,вроде бы. Прога компилится, вроде бы всё выводит.
Просто хотелось бы спросить, всё ли правильно сделано?
Я не особо в этом опытен, поэтому писал,опираясь на чутьё.
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include "Line.h"
#include <conio.h>
#include <vector>
#include "Trapecia.h"
 
using namespace std;
 
int main()
{
 
    setlocale(0, "Russian");
    vector <LineSegent> arr(1);
    cout << " Введите данные первого отрезка " << endl;
    arr.at(0).initFromDialog();
    cout << " Создать еще один отрезок ? Y / N  " << endl;
    char c;
    cin >> c;
    if (c == 'Y' || c == 'y')
    {
        LineSegent tmp;
        tmp.initFromDialog();
        arr.push_back(tmp);
    }
 
    double m = 0, p = 0;
    for (unsigned int i = 0; i < arr.size(); i++)
    {
        m += arr.at(i).mass();
        p += arr.at(i).perimeter();
 
    }
 
    cout << " Масса всех объектов : " << m << endl;
 
    cout << " Периметр всех объектов :  " << p << endl;
    double a = (arr.at(0).position().x* arr.at(0).mass() + arr.at(1).position().x * arr.at(1).mass()) / (arr.at(0).mass() + arr.at(1).mass());
    double b = (arr.at(0).position().y * arr.at(0).mass() + arr.at(1).position().y * arr.at(1).mass()) / (arr.at(0).mass() + arr.at(1).mass());
    cout << "Центр масс всей системы равен : x = " << a << " |  y = " << b << endl;
    cout << " Площадь всех объектов  равна : " << arr.at(0).square() + arr.at(1).square() << endl;
    cout << " Объекты занимают " << arr.at(0).size() << endl;
 
    cout << " \n ******Трапеция ****** " << endl;
    vector <Hexagon> ar(1);
 
    cout << " Введите данные первого отрезка " << endl;
    ar.at(0).initFromDialog();
    cout << " Создать еще один отрезок ? Y / N  " << endl;
    cin >> c;
    if (c == 'Y' || c == 'y')
    {
        Hexagon tmp;
        tmp.initFromDialog();
        ar.push_back(tmp);
 
        m = 0; p = 0;
        for (unsigned int i = 0; i < ar.size(); i++)
        {
            m += ar.at(i).mass();
            p += ar.at(i).perimeter();
 
        }
 
        cout << " Масса всех объектов : " << m << endl;
 
        cout << " Периметр всех объектов :  " << p << endl;
        double a = (ar.at(0).position().x* ar.at(0).mass() + ar.at(1).position().x * ar.at(1).mass()) / (ar.at(0).mass() + ar.at(1).mass());
        double b = (ar.at(0).position().y * ar.at(0).mass() + ar.at(1).position().y * ar.at(1).mass()) / (ar.at(0).mass() + ar.at(1).mass());
        cout << "Центр масс всей системы равен : x = " << a << " |  y = " << b << endl;
        cout << " Площадь всех объектов  равна : " << ar.at(0).square() + ar.at(1).square() << endl;
        cout << " Объекты занимают " << ar.at(0).size() << endl;
 
    }
    cin >> a;
 
    _getch();
    return 0;
 
}
Line.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "Line.h"
 
 
int LineSegent::countSegments = 0;
double LineSegent::mass()
{
 
    return  mass_A + mass_B;
}
 
Vector2D LineSegent::position()
{
    Vector2D res;
    res.x = (dotA.x *  mass_A + dotB.x * mass_B) / (mass_A + mass_B);
    res.y = (dotA.y *  mass_A + dotB.y * mass_B) / (mass_A + mass_B);
 
 
    return  res;
}
 
double LineSegent::square()
{
    return 0.0;
}
 
double LineSegent::perimeter()
{
 
    return 0.0;
}
 
void LineSegent::initFromDialog()
{
    cout << " \n\n\n";
    cout << " Нужно ввести имя объекта  " << endl;
    char str[20];
 
    cin >> str;
    name = str;
    cout << " Нужно ввести координату x точки A : " << endl;
    cin >> dotA.x;
    cout << " Нужно ввести координату y :  точки А: " << endl;
    cin >> dotA.y;
    cout << " Нужно ввести координату x точки В : " << endl;
    cin >> dotB.x;
    cout << " Нужно ввести координату y :  точки В: " << endl;
    cin >> dotB.y;
    cout << " Нужно ввести массу  точки A : " << endl;
    cin >> mass_A;
    cout << " Нужно ввести массу  точки В : " << endl;
    cin >> mass_B;
    countSegments++;
}
 
const char * LineSegent::classname()
{
 
    return name;
}
 
unsigned int LineSegent::size()
{
    return sizeof(LineSegent) * countSegments;
}
 
void LineSegent::draw()
{
    cout << " Имя Отрзка : " << classname() << endl;
    cout << " Масса отрезка равна :  " << mass() << endl;
    cout << " Периметр отрезка равен :  " << perimeter() << endl;
    cout << " Координаты цетра масс :  x =   " << position().x << "  y =   " << position().y << endl;
    cout << " Площадь отрезка равна : " << square() << endl;
 
    cout << " \n\n\n Размер занимаемый в памяти всеми объектами : " << size() << endl;
 
}
 
bool LineSegent::operator==(const PhysObject & ob) const
{
    return true; // тут в общем такая тема ) это нельзя сделать , ну у меня не получилось , ибо аргумет - объект чисто абстрактного класса который сделать нельзя )
}
 
bool LineSegent::operator<(const PhysObject & ob) const
{
    return false;// таже история ) 
}
Line.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma once
#include <iostream>
#include <vector>
#include "intf.h"
 
using namespace std;
class Hexagon;
class LineSegent : public PhysObject, public GeoFig, public Printable, public DialogInitiable, public BaseCObject
{
private:
    Vector2D dotA;
    Vector2D dotB;
    double mass_A;
    double mass_B;
    char * name;
    static int countSegments;
 
public:
 
    friend Hexagon;
    double mass();
    Vector2D position();
    double square();
    double perimeter();
    void initFromDialog();
    const char* classname();
    unsigned int size();
    void draw();
 
    bool operator== (const PhysObject& ob) const;
    bool operator< (const PhysObject& ob) const;
};
Trapecia.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "Trapecia.h"
 
 
int Hexagon::countHexagons = 0;
double Hexagon::mass()
{
    return   A.mass() + B.mass() + C.mass() + D.mass();
}
 
double length(double Ax, double Ay, double Bx, double By)
{
    return sqrt(Ax * Bx + Ay * By);
}
Vector2D Hexagon::position()
{
    Vector2D a;
    a.x = (A.position().x - C.position().x) / 2;
    a.y = (A.position().y - C.position().y) / 2;
    return a;
}
 
double Hexagon::square()
{
    return pow(length(A.dotA.x, A.dotA.y, A.dotB.x, A.dotB.y), 2);
}
 
double Hexagon::perimeter()
{
    return length(A.dotA.x, A.dotA.y, A.dotB.x, A.dotB.y)
        + length(B.dotA.x, B.dotA.y, B.dotB.x, B.dotB.y)
        + length(C.dotA.x, C.dotA.y, C.dotB.x, C.dotB.y)
        + length(D.dotA.x, D.dotA.y, D.dotB.x, D.dotB.y);
 
 
}
 
void Hexagon::initFromDialog()
{
    cout << " \n\n\n";
    cout << " Нужно ввести имя объекта  " << endl;
    char str[20];
    cin >> str;
    Name = str;
 
    cout << " сторона A : " << endl;
    A.initFromDialog();
 
    cout << " сторона B : " << endl;
    B.initFromDialog();
 
    cout << " сторона C : " << endl;
    C.initFromDialog();
 
    cout << " сторона D : " << endl;
    D.initFromDialog();
 
 
}
 
const char * Hexagon::classname()
{
    return Name;
}
 
unsigned int Hexagon::size()
{
    return sizeof(Hexagon) * countHexagons;
}
 
void Hexagon::draw()
{
 
    cout << " Имя Отрзка : " << classname() << endl;
    cout << " Масса отрезка равна :  " << mass() << endl;
    cout << " Периметр отрезка равен :  " << perimeter() << endl;
    cout << " Координаты цетра масс :  x =   " << position().x << "  y =   " << position().y << endl;
    cout << " Площадь отрезка равна : " << square() << endl;
 
    cout << " \n\n\n Размер занимаемый в памяти всеми объектами : " << size() << endl;
 
}
 
bool Hexagon::operator==(const PhysObject & ob) const
{
 
    return false;
}
 
bool Hexagon::operator<(const PhysObject & ob) const
{
 
    return false;
}
Trapecia.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma once
#pragma once
#include "intf.h"
#include "Line.h"
#include <math.h>
 
class Hexagon : public PhysObject, public GeoFig, public Printable, public DialogInitiable, public BaseCObject
{
private:
 
    LineSegent A;
    LineSegent B;
    LineSegent C;
    LineSegent D;
 
 
    static int countHexagons;
    char * Name;
 
 
public:
 
    double mass();
    Vector2D position();
    double square();
    double perimeter();
    void initFromDialog();
    const char* classname();
    unsigned int size();
    void draw();
 
 
    bool operator== (const PhysObject& ob) const;
    bool operator< (const PhysObject& ob) const;
 
 
};
intf.h (interface.h)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#pragma once
 
class GeoFig {
public:
    // Площадь.
    virtual double square() = 0;
    // Периметр.
    virtual double perimeter() = 0;
};
 
// Вектор
class Vector2D {
public:
    double x, y;
};
 
// Интерфейс "Физический объект".
class PhysObject {
public:
    // Масса, кг.
    virtual double mass() = 0;
    // Координаты центра масс, м.
    virtual Vector2D position() = 0;
    // Сравнение по массе.
    virtual bool operator== (const PhysObject& ob) const = 0;
    // Сравнение по массе.
    virtual bool operator< (const PhysObject& ob) const = 0;
};
 
// Интерфейс "Отображаемый"
class Printable {
public:
    // Отобразить на экране
    // (выводить в текстовом виде параметры фигуры).
    virtual void draw() = 0;
};
 
// Интерфейс для классов, которые можно задать через диалог с пользователем.
class DialogInitiable {
    // Задать параметры объекта с помощью диалога с пользователем.
    virtual void initFromDialog() = 0;
};
 
// Интерфейс "Класс"
class BaseCObject {
public:
    // Имя класса (типа данных).
    virtual const char* classname() = 0;
    // Размер занимаемой памяти.
    virtual unsigned int size() = 0;
 
};
Добавлено через 28 минут
Почему-то выводит площадь и периметр фигур 0.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2016, 14:24     Интерфейсы в классах
Посмотрите здесь:

константы в классах C++
C++ Необычные пользовательские интерфейсы
Интерфейсы и наследования C++
C++ интерфейсы в с ++
Интерфейсы C++
Для чего нужны интерфейсы? C++
Абстрактные классы. Интерфейсы C++
Указатели на интерфейсы и их освобождение C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 20:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru