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

Задание по наследованию классов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Recew
3 / 3 / 0
Регистрация: 22.03.2011
Сообщений: 17
22.03.2011, 21:50     Задание по наследованию классов #1
Создать иерархию классов : линия - прямоугольник - пирамида. Все классы должны содержать методы для фиксации и получения значений всех координат, а производные классы методы вычисления площади (прямоугольник), площади поверхности и объема (пирамида).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//line.h
#include <conio.h>
#define LINE_h
#ifndef LINE_h1
 
class line
{
public:
int x,y;
int a1, a2, b1, b2;
public:
void getLine();
void showLine();
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//line.cpp
#include <conio.h>
#include <iostream.h>
#include "F:\\1\line.h"
 
void line::getLine()
{
cout << "Inp. x and y coordinates A(x, y): x ->";
cin >> x; cout << " y->"; cin >> y;
a1 = x; b1 = y;
cout << "\nInp. x and y coordinates B(x, y): x ->";
cin >> x; cout << " y->"; cin >> y;
a2 = x; b2 = y;
}
 
void line::showLine()
{
cout << "\nLine with coordinates: A(" << a1 << ";" << b1 << ") B(" << a2 << ";" << b2 << ") has been created.";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//rect.h
#include <conio.h>
#include "line.h"
#define RECT_h
#ifndef RECT_h1
 
class rect : public line
{
public:
int a1, b1, a2, b2, a3, b3, a4, b4;
void getRect();
void showRect();
void squareRect();
};
 
#endif
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
//rect.cpp
#include <conio.h>
#include <iostream.h>
#include "F:\\1\rect.h"
 
void rect::getRect()
{
cout << "Inp. x and y coordinates A(x, y): x->";
cin >> x; cout <<" y->"; cin >> y;
a1 = x; b1 = y;
cout << "Inp. x and y coordinates B(x, y): x->";
cin >> x; cout <<" y->"; cin >> y;
a2 = x; b2 = y;
cout << "Inp. x and y coordinates C(x, y): x->";
cin >> x; cout <<" y->"; cin >> y;
a3 = x; b3 = y;
cout << "Inp. x and y coordinates D(x, y): x->";
cin >> x; cout <<" y->"; cin >> y;
a4 = x; b4 = y;
}
 
void rect::showRect()
{
cout << "Rectangle with coordinates: A(" << a1 << ";" << b1 << ") B(" << a2 << ";" << b2
<< ") C(" << a3 << ";" << b3 << ") D(" << a4 << ";" << b4 << ") has been created.";
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
//drvRect
#include <conio.h>
#include <iostream.h>
#include "rect.h"
 
void main()
{
rect r;
r.getRect();
r.showRect();
getch();
}
Возникают ошибки:
[ILINK32 Error] Error: Unresolved external 'rect::getRect()' referenced from F:\путь\SOURCE\DEBUG\WIN32\DRVRECT.OBJ
[ILINK32 Error] Error: Unresolved external 'rect::showRect()' referenced from F:\путь\SOURCE\DEBUG\WIN32\DRVRECT.OBJ
Помогите исправить.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
22.03.2011, 22:51     Задание по наследованию классов #2
там точно наследование???
по моему они совершенно разные
может быть использование
тогда
класс линия
содержит
координаты начала(тоже можно отдельный класс)
координаты конца
класс прямоугольник
содержит
4 линии
класс пирамида
содержит
6 прямоугольников

Добавлено через 21 минуту
ну если наследование то может так
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
class line
{
public:
int x1,x2,y1,y2;//координаты начала конца
line();// конструктор для инициализации коодинат (у тебя нету)
virtual show();// рисование пригодится в классах наследниках
}
class rect : public line
{
public:
rect();// конструктор
int  x3,x4,y3,y4;// координаты двух вершин (две в линии)
virtual show();//рисование
virtual square(); // площадь пригодится потом
}
class Piramid: public rect
{
public:
Piramid()// конструктор
int x5,x6;// координаты вершины
virtual show();// рисование
virtual square(); // площадь
obem(); // вычисление объема не помню по аглицки
}
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
22.03.2011, 23:00     Задание по наследованию классов #3
Цитата Сообщение от Recew Посмотреть сообщение
#define LINE_h
#ifndef LINE_h1
А это для чего? Если, как мне кажется, для избежания повторного включения в объектник, то сделано неверно. Макроимя LINE_h1 нигде не объявлено в рамках приведенного кода. И исходя из того, что #endif закрывает код под условием наличия макроимени LINE_h1, то что линковщик не видит код вполне законно. Попробуйте так:
C++
1
2
3
4
#ifndef LINE_H
#define LINE_H
//code
#endif
IrineK
Заблокирован
23.03.2011, 00:57     Задание по наследованию классов #4
ValeryS
объема не помню по аглицки
- volume

класс пирамида содержит 6 прямоугольников
Это как? О_о
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
23.03.2011, 01:02     Задание по наследованию классов #5
сглупил

Добавлено через 1 минуту
попутал с параллепипедом
IrineK
Заблокирован
23.03.2011, 01:09     Задание по наследованию классов #6
В некоторой степени ValeryS прав.
Естественней смотрелось бы такое наследование:
линия - прямоугольник - параллелепипед
или такое:
линия - треугольник - пирамида
Recew, может чего напуталось в задании?
Recew
3 / 3 / 0
Регистрация: 22.03.2011
Сообщений: 17
23.03.2011, 17:39  [ТС]     Задание по наследованию классов #7
Цитата Сообщение от IrineK Посмотреть сообщение
Recew, может чего напуталось в задании?
Нет, задание верное.

Вот в чем была ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
//drvRect
#include <conio.h>
#include <iostream.h>
#include "rect.cpp"//а не rect.h
 
void main()
{
rect r;
r.getRect();
r.showRect();
getch();
}
Что-ж буду разбираться дальше, если возникнут трудности - обращусь.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
23.03.2011, 21:57     Задание по наследованию классов #8
это не главная ошибка
главная в том что ты не правильно наследуешь классы
примерную схему наследования я накидал
ты наследуешь класс прямоугольник от класса линия,но ничего от него не берешь
переопределил все функции все поля. Зачем тогда наследовать?
принцип наследования
создается базовый класс с какими-то параметрами
класс наследник имеет все что имеет базовый класс +какие то свои параметры
наследник наследника добавляет свое и т.д.
вот так и создается иерархия классов
а ты каждый класс описываешь заново
IrineK
Заблокирован
24.03.2011, 00:03     Задание по наследованию классов #9
Вообще-то наследование - это отношение: "is a..."
Является ли треугольник (прямоугольник) линией? - нет. Является ли пирамида треугольником? - нет.

Здесь другое отношение - "has a...". Это вложение (embedded objects).
Линия -> Треугольник содержит 3 линии -> Пирамида (треугольная) содержит 4 треугольника

Я тут набросала. Линию сделала направленной (вектор), в будущем пригодится. Удобно площади считать.

Здесь линия (вектор) и треугольник:
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <math.h>
using namespace std;
 
class Vector
{
private: 
    double _xA,_yA,_xB,_yB;
    double _dX,_dY;
    
public:
    Vector(double xA, double yA, double xB, double yB):
      _xA(xA),_yA(yA),_xB(xB),_yB(yB),_dX(xB-xA),_dY(yB-yA){} 
    Vector():_xA(0),_yA(0),_xB(0),_yB(0),_dX(0),_dY(0) {}
    ~Vector(){}
 
    void SetVector(double xA, double yA, double xB, double yB)
    {   _xA=xA;_yA=yA;_xB=xB;_yB=yB;
        _dX = xB-xA; _dY = yB-yA;
    }
 
    double GetVectorDX(){return _dX;}
    double GetVectorDY(){return _dY;}
        
    Vector &operator =(Vector& MN)
    {   if(&MN!=this)
        {   _xA=MN._xA;
            _yA=MN._yA;
            _xB=MN._xB;
            _yB=MN._yB;
            _dX=MN._dX;
            _dY=MN._dY;
        }
        return *this;
    }
 
    double Length()
    {   return sqrt(_dX*_dX + _dY*_dY);
    }
 
    friend double ScalarProduct(Vector &a, Vector &b)
    {   return a._dX*b._dX+a._dY*b._dY;
    }
 
    friend double Angle(Vector &a, Vector &b)
    {   return acos(ScalarProduct(a,b)/(a.Length()*b.Length()));
    }
 
};
 
 
class Triangle
{
private:
    Vector _AB,_AC,_BC;
 
public:
        Triangle(double xA, double yA, double xB, double yB, double xC, double yC):
            _AB(xA,yA,xB,yB), _AC(xA,yA,xC,yC), _BC(xB,yB,xC,yC){}
        Triangle():_AB(0,0,0,0),_AC(0,0,0,0), _BC(0,0,0,0) {}
        ~Triangle(){}
 
    void SetTriangle(double xA, double yA, double xB, double yB, double xC, double yC)
    {   Vector AB(xA,yA,xB,yB);
        Vector AC(xA,yA,xC,yC);
        Vector BC(xB,yB,xC,yC);
        _AB = AB;
        _AC = AC;
        _BC = BC;
        bool find = this->FoundErr();
    }
 
    bool FoundErr()
    {   double a =_BC.Length(),b = _AC.Length(),c = _AB.Length();
        if(a*b*c==0)
        {   cout<<"ERROR: zero side\n";
            return true;
        }
        else if(a+b<=c || a+c<=b || b+c<=a)
        {   cout<<"ERROR: one side too long\n";
            return true;
        }
        return false;
    }
 
    double Square()
    {   bool find = this->FoundErr();
        if(!find)
            return 0.5*fabs(_AB.GetVectorDX()*_AC.GetVectorDY()-_AC.GetVectorDX()*_AB.GetVectorDY());
        return 0;
    }
 
    bool isRectangular()
    {   bool find = this->FoundErr();
        if(!find)
            if(ScalarProduct(_AB,_AC)==0 || ScalarProduct(_AB,_BC)==0 
                || ScalarProduct(_BC,_AC)==0) return true;
        return false;
    }
 
    bool isEquilateral()
    {   bool find = this->FoundErr();
        if(!find)
        {
            if(_AB.Length()==_AC.Length() && _AC.Length()==_BC.Length()) return true;
        }
        return false;
    }
 
    bool isIsosceles()
    {   bool find = this->FoundErr();
        if(!find)
            if(_BC.Length()==_AC.Length() || _BC.Length()==_AB.Length() 
                || _AC.Length()==_AB.Length()) return true;
        return false;
    }
};
 
int main()
{   Vector L0;
    cout<<"Length of 0 vector: "<<L0.Length()<<endl;
    L0.SetVector(1,1,5,5);
    cout<<"Length of set vector: "<<L0.Length()<<endl;
 
    Vector L1(1,1,-5,-5);
    cout<<"Scalar Product: "<<ScalarProduct(L0,L1)<<endl;
    cout<<"Angle (Pi): "<< Angle(L0,L1)<<endl;
 
    Triangle T0;
    cout<<"Square of 0 triangle: "<<T0.Square()<<endl;
    T0.SetTriangle(5,0,0,5,0,0);
    cout<<"Square of set triangle T0: "<<T0.Square()<<endl;
    cout<<"Is rectangular: "<<T0.isRectangular()<<endl;
    cout<<"Is isosceles: "<<T0.isIsosceles()<<endl;
    cout<<"Is Equilateral: "<<T0.isEquilateral()<<endl;
 
    Triangle T1(1,1,5,5,9,1);
    cout<<"\nSquare of another triangle T1: "<<T1.Square()<<endl;
    cout<<"Is rectangular: "<<T1.isRectangular()<<endl;
    cout<<"Is isosceles: "<<T1.isIsosceles()<<endl;
    cout<<"Is Equilateral: "<<T1.isEquilateral()<<endl;
    
    cin.get();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2011, 00:08     Задание по наследованию классов
Еще ссылки по теме:

Вопросы по наследованию C++
C++ Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс
C++ Наследование классов. Недопонимаю задание

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,045
24.03.2011, 00:08     Задание по наследованию классов #10
я про это и писал в первом сообщении
наследование притянуто за уши
но это на совести того кто составляет такие задания
Yandex
Объявления
24.03.2011, 00:08     Задание по наследованию классов
Ответ Создать тему
Опции темы

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