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

Создание классов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.94
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
26.05.2012, 12:56     Создание классов #1
Создать абстрактный базовый класс Triangle(треугольеник) для представления треугольника виртуальными функциями вычисления площади и периметра. Поля должны включать две стороны и угол между ними. Определить классы-наследники: прямоугольный треугольник, равнобедренный треугольник, равносторонний треугольник со своими функциями перевода и вывода на экран
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 12:56     Создание классов
Посмотрите здесь:

C++ Создание классов
создание классов C++
C++ Создание классов
C++ Создание системы классов
C++ создание классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Рыжий Лис
Просто Лис
 Аватар для Рыжий Лис
209 / 164 / 44
Регистрация: 17.05.2012
Сообщений: 611
Записей в блоге: 4
26.05.2012, 13:38     Создание классов #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//базовый класс
class Triangle
{ private:
    double a,b; //2 стороны
    double u;   //угол
  public:
    Triangle(){}
    virtual ~Triangle(){}
    virtual double S() = 0;//площадь // виртуальная функция.
    virtual double P() = 0;//периметр// виртуальная функция.
};
/*
double Triangle::S()
{
  return 0.5*a*b*sin(u);    
}
double Triangle::P()
{
  double с = sqrt(a*a+b*b-2*a*b*cos(u));
  return a+b+c; 
}
*/
Bers
Заблокирован
26.05.2012, 13:42     Создание классов #3
Рыжий лис:
1. Вы описали не абстрактный класс.
2. Вы не_описали виртуальный диструктор, что потенциально приведет к утечкам памяти.
Рыжий Лис
Просто Лис
 Аватар для Рыжий Лис
209 / 164 / 44
Регистрация: 17.05.2012
Сообщений: 611
Записей в блоге: 4
26.05.2012, 14:03     Создание классов #4
Цитата Сообщение от Bers Посмотреть сообщение
Рыжий лис:
1. Вы описали не абстрактный класс.
2. Вы не_описали виртуальный диструктор, что потенциально приведет к утечкам памяти.
Уже переделал

Добавлено через 16 минут
добавил класс прямоугольный треугольник
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
#include <iostream>
#include <math.h>
using namespace std;
//базовый класс
class Triangle
{ protected:
    double a,b; //2 стороны
    double u;   //угол
  public:
    Triangle(){}
    virtual ~Triangle(){}
    virtual double S() = 0; //площадь
    virtual double P() = 0; //периметр
};
class pryam : public Triangle //прямоугольный треугольник
{
  public:
    pryam(){}
    virtual ~pryam(){}
    virtual double S(); //площадь
    virtual double P(); //периметр
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
}
int main()
{
  pryam a;
 
}
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
26.05.2012, 22:57  [ТС]     Создание классов #5
Рыжий Лис, по аналогии создал ещё 2 класса наследника, что дальше?

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
#include <iostream>
#include <math.h>
using namespace std;
//ГЎГ*çîâûé ГЄГ«Г*Г±Г±
class Triangle
{ protected:
    double a,b; //2 ñòîðîГ*Г»
    double u;   //óãîë
  public:
    Triangle(){}
    virtual ~Triangle(){}
    virtual double S() = 0; //ïëîùГ*äü
    virtual double P() = 0; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüГ*ûé òðåóãîëüГ*ГЁГЄ
{
  public:
    pryam(){}
    virtual ~pryam(){}
    virtual double S(); //ïëîùГ*äü
    virtual double P(); //ïåðèìåòð
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
public:
    ravbedr(){}
    virtual ~ravbedr(){};
    virtual double S();
    virtual double P();
};
double ravbedr::S()
{
    double c=2*a*b*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*b*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
public:
    ravstor(){}
    virtual ~ravstor(){}
    virtual double S();
    virtual double P();
};
double ravstor::S()
{
    return 0.43*a*b;
}
double ravstor::P()
{
    return 3*a;
}
int main()
{
  pryam a;
 
}
Добавлено через 4 часа 18 минут
как в данном задании описать int main ?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
27.05.2012, 02:59     Создание классов #6
С вычислением площади и периметра вы явно что-то намудрили. Зачем в производных классах виртуальные методы? Я бы еще понял, если был бы class ravstor : public ravbedr, что по сути является правильным.
В базовый класс добавь аргументированный конструктор:
C++
1
Triangle(double x, double y, double z): a(x), b(y), u(z){}
и в производные, вызывая в них конструктор базового:
C++
1
pryam(double x, double y, double z): Triangle(x, y, z){}
А меин выглядит вобщем то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
27.05.2012, 14:21  [ТС]     Создание классов #7
так?
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
#include <iostream>
#include <math.h>
using namespace std;
//ГЎГ*çîâûé ГЄГ«Г*Г±Г±
class Triangle
{ protected:
    double a,b; //2 ñòîðîГ*Г»
    double u;   //óãîë
  public:
    Triangle(){}
    Triangle(double x, double y, double z): a(x), b(y), u(z){}
    virtual ~Triangle(){}
    virtual double S() = 0; //ïëîùГ*äü
    virtual double P() = 0; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüГ*ûé òðåóãîëüГ*ГЁГЄ
{
    pryam(double x, double y, double z): Triangle(x, y, z){}
  public:
    pryam(){}
    virtual ~pryam(){}
    virtual double S(); //ïëîùГ*äü
    virtual double P(); //ïåðèìåòð
 
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
    ravbedr(double x, double y, double z): Triangle(x, y, z){}
  public:
    ravbedr(){}
    virtual ~ravbedr(){};
    virtual double S();
    virtual double P();
};
double ravbedr::S()
{
    double c=2*a*b*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*b*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
    ravstor(double x, double y, double z): Triangle(x, y, z){}
  public:
    ravstor(){}
    virtual ~ravstor(){}
    virtual double S();
    virtual double P();
};
double ravstor::S()
{
    return 0.43*a*b;
}
double ravstor::P()
{
    return 3*a;
}
/////////////////////////////
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
27.05.2012, 14:31     Создание классов #8
Аргументированные конструкторы должны быть в public. Изначально в классе стоит модификатор доступа private.
Посмотри формулы вычисления, мне показалось там не все правильно высчитывает.
По хорошему, равносторонний треугольник должен наследовать равнобедренный. А зачем все методы произвольных классов делать виртуальными, я не знаю. Вроде нужно так делать только тогда, когда принадлежность объекта к классу определяется во время исполнения. Т.е. в базовом и в равнобедренном, если будешь от него наследовать равносторонний. Поправьте меня, если я не прав.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
27.05.2012, 14:46  [ТС]     Создание классов #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Аргументированные конструкторы должны быть в public. Изначально в классе стоит модификатор доступа private.
Посмотри формулы вычисления, мне показалось там не все правильно высчитывает.
По хорошему, равносторонний треугольник должен наследовать равнобедренный. А зачем все методы произвольных классов делать виртуальными, я не знаю. Вроде нужно так делать только тогда, когда принадлежность объекта к классу определяется во время исполнения. Т.е. в базовом и в равнобедренном, если будешь от него наследовать равносторонний. Поправьте меня, если я не прав.
да, ошибочка была в формулах, спасибо

вот так выходит:
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
#include <iostream>
#include <math.h>
using namespace std;
//ГЎГ*çîâûé ГЄГ«Г*Г±Г±
class Triangle
{ protected:
    double a,b; //2 ñòîðîГ*Г»
    double u;   //óãîë
  public:
    Triangle(){}
    Triangle(double x, double y, double z): a(x), b(y), u(z){}
    ~Triangle(){}
    double S() ; //ïëîùГ*äü
    double P() ; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüГ*ûé òðåóãîëüГ*ГЁГЄ
{
public:
    pryam(double x, double y, double z): Triangle(x, y, z){}
    pryam(){}
    ~pryam(){}
    double S(); //ïëîùГ*äü
    double P(); //ïåðèìåòð
 
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
 
  public:
    ravbedr(double x, double y, double z): Triangle(x, y, z){}
    ravbedr(){}
     ~ravbedr(){};
     double S();
     double P();
};
double ravbedr::S()
{
    double c=2*a*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
 public:
     ravstor(double x, double y, double z): Triangle(x, y, z){}
    ravstor(){}
     ~ravstor(){}
     double S();
     double P();
};
double ravstor::S()
{
    return 0.43*a*a;
}
double ravstor::P()
{
    return 3*a;
}
/////////////////////////////
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
27.05.2012, 14:52     Создание классов #10
Дейструкторы в производных классах можно убрать, раз они не виртуальные и работы с памятью не происходит, толку их изменять нет. Система итак создаст по-умолчанию.
А в целом, если не хотите наследовать равносторонний от равнобедренного, можно на этом остановиться. Я бы посоветовал убрать в main-e полные названия функций (std:, либо строчку using namespace std; но это уже мелочи.
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
27.05.2012, 15:07  [ТС]     Создание классов #11
Цитата Сообщение от MrGluck Посмотреть сообщение
Дейструкторы в производных классах можно убрать, раз они не виртуальные и работы с памятью не происходит, толку их изменять нет. Система итак создаст по-умолчанию.
А в целом, если не хотите наследовать равносторонний от равнобедренного, можно на этом остановиться. Я бы посоветовал убрать в main-e полные названия функций (std:, либо строчку using namespace std; но это уже мелочи.

сделал

вот только выдаёт такие ошибки (но не указывает в каких строках)

Triangle.obj : error LNK2001: unresolved external symbol "public: double __thiscall Triangle::P(void)" (?P@Triangle@@QAENXZ)
Triangle.obj : error LNK2001: unresolved external symbol "public: double __thiscall Triangle::S(void)" (?S@Triangle@@QAENXZ)
Debug/Наслед.exe : fatal error LNK1120: 2 unresolved externals
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
27.05.2012, 15:11     Создание классов #12
Цитата Сообщение от tarakano Посмотреть сообщение
сделал

вот только выдаёт такие ошибки (но не указывает в каких строках)
а код где?

Добавлено через 1 минуту
и зачем вы убрали чисто виртуальные функции в базовом классе Triangle? Верните их на место.

Добавлено через 1 минуту
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
#include <iostream>
#include <cmath>
//ГЎГ*çîâûé ГЄГ«Г*Г±Г±
class Triangle
{ protected:
    double a,b; //2 ñòîðîГ*Г»
    double u;   //óãîë
  public:
    Triangle(){}
    Triangle(double x, double y, double z): a(x), b(y), u(z){}
    virtual ~Triangle(){}
    virtual double S() = 0; //ïëîùГ*äü
    virtual double P() = 0; //ïåðèìåòð
};
class pryam : public Triangle //ïðÿìîóãîëüГ*ûé òðåóãîëüГ*ГЁГЄ
{
public:
    pryam(double x, double y, double z): Triangle(x, y, z){}
    pryam(){}
    double S(); //ïëîùГ*äü
    double P(); //ïåðèìåòð
 
};
double pryam::S()
{
  return 0.5*a*b*sin(u);//?
}
double pryam::P()
{
  double c = sqrt(a*a+b*b-2*a*b*cos(u));//?
  return a+b+c;//?
};
///////////////
class ravbedr : public Triangle
{
 
  public:
    ravbedr(double x, double y, double z): Triangle(x, y, z){}
    ravbedr(){}
     double S();
     double P();
};
double ravbedr::S()
{
    double c=2*a*sin(u/2); 
    double p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
double ravbedr::P()
{
    double c=2*a*sin(u/2); 
    return a+b+c;
}
///////////////////
class ravstor : public Triangle
{
 public:
     ravstor(double x, double y, double z): Triangle(x, y, z){}
    ravstor(){}
     double S();
     double P();
};
double ravstor::S()
{
    return 0.43*a*a;
}
double ravstor::P()
{
    return 3*a;
}
/////////////////////////////
int main()
{
    Triangle *pt = NULL;
    int a, b, u;
    do
    {
        std::cout<< "Enter length of the first side: "; std::cin>> a;
        std::cout<< "Enter length of the second side: "; std::cin>> b;
        std::cout<< "Enter the angle between the sides: "; std::cin>> u;
    } while (a < 0 || b < 0 || u < 0 || u > 180);
    if (a == b)
    {
        if (u == 60) pt = new ravstor(a, b, u);
        else pt = new ravbedr(a, b, u);
    }
    else if(u == 90) pt = new pryam(a, b, u);
    if (pt == NULL) std::cout<< "Random triangle, count yourself, it's boring...";
    else std::cout<< "P = "<< pt->P()<< "\nS = "<< pt->S();
    delete pt;
    return 0; 
}
tarakano
34 / 26 / 5
Регистрация: 24.12.2010
Сообщений: 164
27.05.2012, 15:28  [ТС]     Создание классов #13
MrGluck? все работает, спасибо!
вот ворпрос возник, а зачем нам virtual в базовом классе? - тк у нас несколько других наследует одновременно этот класс или не поэтому?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2012, 16:17     Создание классов
Еще ссылки по теме:

C++ Создание вектора классов
Задание на создание классов C++
C++ Создание классов

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
27.05.2012, 16:17     Создание классов #14
C++
1
2
virtual double S() = 0; //площадь
virtual double P() = 0; //периметр
это чисто виртуальные функции. Мы указываем, что реализация этих функций будет происходить в каком-либо производном классе. Пока класс содержит хоть одну неопределенную функцию он абстрактен. Перед деструктором мы пишем virtual потому, что надо указать, что принадлежность объекта к классу должна определяться во время исполнения. Если будет непонятен этот момент - могу порыться и найти код, показывающий всю важность объявления деструктора виртуальным.
Вобще, почитайте про виртуальные функции, чисто виртуальные функции.
Yandex
Объявления
27.05.2012, 16:17     Создание классов
Ответ Создать тему
Опции темы

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