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

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

Восстановить пароль Регистрация
 
vladis222
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 78
08.04.2012, 20:09     Наследование в С++ #1
Здравствуйте, написал вот код для программы с наследованием, работает, но когда вычисляет площадь, пишет: S=0,когда площадь не равна нулю. Помогите, понять, что за ошибка. В задании нужно вычислить площадь круга которая останется после удаления из него вписанного круга. Сделать наследование с помощью класса Точка. Вот у меня здесь и описано такое наследование.
C++ (Qt)
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
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<locale>
 
using namespace std;
const float PI=3.14f;    //не знаю почему выделывается но можно вот так, компилятор хавает :)
 
class CPoint              
{
protected:
    float X,Y;
public:
    CPoint(float iX,float iY);
    ~CPoint(){}
    float GetX();               //Базовый класс-точка
    float GetY();
};
 
class CCircle:public CPoint
{
private:
    float Cx,Cy;
public:
    CCircle(float iX,float iY,float iCx,float iCy);/*Класс-наследник Окружность*/
    ~CCircle(){}
   float Square(float X, float Cx, float Y, float Cy);
};
 
CPoint::CPoint(float iX,float iY)
{
    X=iX;
    Y=iY;
}
float CPoint::GetX()
{
    return X;
}
float CPoint::GetY()
{
    return Y;
}
CCircle::CCircle(float iX, float iY,float iCx,float iCy):CPoint(iX,iY)
{ 
     Cx=iCx;
     Cy=iCy;
}
float CCircle::Square(float X,float Cx, float Y, float Cy)
{
  float S;
  S=PI*(pow((X-Cx),2)+pow((Y-Cy),2));
  return S;
}
int main(void)
{
    setlocale(LC_ALL,"Rus");
    float X1,Y1,X2,Y2,C1x,C2x,C1y,C2y; float S1,S2,dif;
    X1=Y1=X2=Y2=C1x=C2x=C1y=C2y=dif=0; 
    CCircle C1 = CCircle(X1,C1x,Y1,C1y);
    CCircle C2 = CCircle(X2,C2x,Y2,C2y);
    cout<<"Введите координаты точки первой окружности : ";
    cin>>X1>>Y1;
    cout<<"Введите координаты точки второй окружности : ";
    cin>>X2>>Y2;
    cout<<"Введите координаты центра первой окружности : ";
    cin>>C1x>>C1y;
    cout<<"Введите координаты центра второй окружности : ";
    cin>>C2x>>C2y;
     S1=C1.Square(X1,C1x,Y1,C1y);
     S2=C2.Square(X2,C2x, Y2,C2y);
    dif=S1-S2;
    if(dif=0)
    cerr<<"Ошибка. Площадь равна нулю";
    else
    {cout<<"Искомая площадь равна (кв.ед)\n";
    cout<<dif;};
    getch();
    return 0;
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 20:09     Наследование в С++
Посмотрите здесь:

Наследование C++
Наследование C++
C++ Наследование
C++ Наследование
Наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 20:18     Наследование в С++ #2
C++
1
float CCircle::Square(float X,float Cx, float Y, float Cy)
Бред какой-то
У тебя Cx и Cy и X,Y -поля класса, зачем ты ещё передаёшь параметры в функцию с такими именами???
Разберись про то, что из методов класса можно обращаться к его полям, и не надо передавать их явно как параметры. Они передаются скрытно, через "Зыс"

А поля класса у тебя равны
C++
1
2
X1=Y1=X2=Y2=C1x=C2x=C1y=C2y=dif=0;
C1 = CCircle(X1,C1x,Y1,C1y);
Вот он и считает у тебя площадь круга нулевого радиуса.
Я не понимаю вообще зачем такой *****код городить?
Понял ошибку или подробнее надо объяснить?

Ну и, наконец, объясните, форумные гуру, зачем наследовать окружность от точки?
Не первый раз встречаю этот пример. Его в какой-то книге пишут? Фамилия автора?
Нелогично же! Окружность не может являться частным случаем точки!!!
vladis222
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 78
08.04.2012, 20:22  [ТС]     Наследование в С++ #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
float CCircle::Square(float X,float Cx, float Y, float Cy)
Бред какой-то
У тебя Cx и Cy - поля класса, зачем ты ещё передаёшь параметры в функцию с такими именами???

А поля класса у тебя равны
C++
1
2
X1=Y1=X2=Y2=C1x=C2x=C1y=C2y=dif=0;
C1 = CCircle(X1,C1x,Y1,C1y);
Вот он и считает у тебя площадь круга нулевого радиуса.
Я не понимаю вообще зачем такой *****код городить?
спасибо за помощь большое, просто я это инициализировал так поля, а подскажите,как нужно было инициализировать?
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
08.04.2012, 20:30     Наследование в С++ #4
Никогда так не наследуйте. Потому что public наследование используется для спецификации обычно. А у в вашем случае: Разве круг является разновидностью точки. Либо используйте private наследование и наследуйте только реализацию, либо вместо класса "точка" сделайте класс "фигура". Тогда круг будет разновидностью фигуры, и тут уже логично пользоваться public наследованием.

Не по теме:

square - это уличная, городская площадь. А площадь к.л. фигуры - area.



+ Класс круга, в независимости наследует ли он только реализацию или интерфейс тоже, должен содержать радиус или диаметр, а у вас опять какие то точки
C++
1
2
3
4
5
6
...
class CCircle:public CPoint
{
private:
    float Cx,Cy;
...
Круг задать двумя точками скорее всего низя)
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 20:34     Наследование в С++ #5
Для начала объясни сам, что такое cx cy у круга
и что такое ix iy у точки?
координаты? Центра? Почему две пары?

Добавлено через 2 минуты
Merovingian +100500
Но мне всё же не понятно это в какой-то книге так учат или какой-то препод в маразм впал?
Не первый раз встречаю задание унаследовать круг от точки
многоугольник от круга.
vladis222
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 78
08.04.2012, 20:48  [ТС]     Наследование в С++ #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Для начала объясни сам, что такое cx cy у круга
и что такое ix iy у точки?
координаты? Центра? Почему две пары?

Добавлено через 2 минуты
Merovingian +100500
Но мне всё же не понятно это в какой-то книге так учат или какой-то препод в маразм впал?
Не первый раз встречаю задание унаследовать круг от точки
многоугольник от круга.
Cx,Cy у круга-координаты центра круга. А X,Y-координаты точки.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
08.04.2012, 20:57     Наследование в С++ #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Добавлено через 2 минуты
Merovingian +100500
Но мне всё же не понятно это в какой-то книге так учат или какой-то препод в маразм впал?
Не первый раз встречаю задание унаследовать круг от точки
многоугольник от круга.

Не по теме:

У нас вот, например, препод в маразм впал. Он мне на паре доказывал, что так делать можно, спорил с ним минут 15, в результате он сказал, что так очень удобно делать иногда бывает и на самом деле он не очень хорошо знает ООП, хотя ведет предмет ООП))
Еще тупее есть задания, которые этими же преподами пишутся, в частности как раз о фигурах там идёт речь.



Добавлено через 6 минут
Цитата Сообщение от vladis222 Посмотреть сообщение
Cx,Cy у круга-координаты центра круга. А X,Y-координаты точки.
Дорогой vladis222, вы судя по всему, начали писать прогу для того чтобы разобраться в наследовании)) Ну ничего страшного, тоже так делал.

Если вы наследуете от класса "точка" класс "круг", то при создании объекта класса "круг" вызывается конструктор класса "точка". Другими словами: поля protected:float X,Y; - координаты точки наследуются(т.е. определять их снова не надо) классом "круг". В этом и смысл наследования

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CPoint              
{
protected:
    float X,Y;
public:
    CPoint(float iX,float iY);
    ~CPoint(){}
    float GetX();               //Базовый класс-точка
    float GetY();
};
 
class CCircle:public CPoint
{
// здесь они не нужны!!! так как уже содержит float X,Y; ибо является наследником
private:
    float radius;// а вот радиус нужен.
// в результате поля: float X,Y и float radius - а ими уже можно задать круг
public:
    CCircle(float iX,float iY,float r);/*Класс-наследник Окружность*/
    ~CCircle(){}
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2012, 20:59     Наследование в С++
Еще ссылки по теме:

C++ наследование С++
наследование C++
C++ Наследование

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.04.2012, 20:59     Наследование в С++ #8
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
#include "StdAfx.h"
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<locale>
using namespace std;
const float PI=3.14f;   
const float eps=0.01f;
class CShape{
protected:
  float X, Y;
public:
  CShape(float=0, float=0);
  ~CShape(){}
};
CShape::CShape(float iX, float iY): X(iX), Y(iY){}
class CCircle: public CShape
{
protected:
    float Cx, Cy;
public:
    CCircle(float=0, float=0,float=0, float=0);
    ~CCircle(){}
   float Area();
};
 
CCircle::CCircle(float iX, float iY,float iCx, float iCy):CShape(iX,iY), Cx(iCx), Cy(iCy){}
 
float CCircle::Area()
{ 
  return PI*(  pow(Cx-X,2)+pow(Cy-Y, 2)  );
}
int main (){
    setlocale(LC_ALL,"Rus");
    float x, y, tx, ty;
    float S1,S2,dif; 
    
    cout<<"Введите координаты точки первой окружности : ";
    cin>>x>>y;
    cout<<"Введите координаты центра первой окружности : ";
    cin>>tx>>ty;
    CCircle C1(x, y, tx, ty);
    cout<<"Введите координаты точки второй окружности : ";
    cin>>x>>y;
    cout<<"Введите координаты центра второй окружности : ";
    cin>>tx>>ty;
    CCircle C2(x, y, tx, ty);
     S1=C1.Area();
     S2=C2.Area();
    cout<<S1<<" "<<S2<<endl;
    dif=S1-S2;
    if(fabs(dif)<eps)//
        cerr<<"Ошибка. Площадь равна нулю";
    else
    {   cout<<"Искомая площадь равна (кв.ед)\n";
        cout<<dif;
    };
    getch();
    return 0;
}
Yandex
Объявления
08.04.2012, 20:59     Наследование в С++
Ответ Создать тему
Опции темы

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