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

Класс "линия" наследуется классом "отрезок" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Alisson
1 / 1 / 0
Регистрация: 10.01.2011
Сообщений: 30
25.04.2011, 20:08     Класс "линия" наследуется классом "отрезок" #1
Помогите, пожалуйста, разобраться с лабораторной. Нужно создать базовый класс "линия": координаты начала и конца, конструктор с параметрами, метод вычисления длины линии, и производный класс "отрезок": конструктор с параметрами, метод вычисления угла между отрезком и осью ОУ, метод вывода данных. Вот мои попытки, но мне выдаёт ошибку "Couldn't find a match for 'intercept::intercept()'"

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
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
class Line
{
double _x1, _y1, _x2, _y2;
public: Line (double x1, double y1, double x2, double y2):
_x1(x1), _y1(y1), _x2(x2), _y2(y2) {}
 
void setx1 (double n) {_x1=n;}
double getx1() {return _x1;}
void sety1 (double m) {_y1=m;}
double gety1() {return _y1;}
void setx2(double l) {_x2=l;}
double getx2() {return _x2;}
void sety2(double k) {_y2=k;}
double gety2() {return _y2;}
 
double Length (double x1, double y1, double x2, double y2)
{
 double a, b, L;
 a=pow ((x2-x1),2);
 b=pow ((y2-y1), 1/2);
 return L=a+b;
}
};
 
class intercept: public Line
{
double a1, b1, a2, b2;
public: intercept (double x, double y, double xx, double yy): Line (a1, b1, a2, b2){}
double angle(double a1, double a2, double b1, double b2)
{
  double A;
  A=1/(atan((a2-a1)/(b2-b1)));
  return A;
}
void prin ()
{
printf("koordinatu nachala otrezka:%f", a1, b1);
printf("koordinatu konza otrezka:%f", a2, b2);
}
};
 
void main ()
{
clrscr();
 
intercept myint;
myint.setx1(13);
myint.sety1(9);
myint.setx2(4);
myint.sety2(1);
myint.prin();
printf ("dlina otrezka=%f", myint.Length (myint.getx1(), myint.gety1(), myint.getx2(), myint.gety2()));
printf ("ygol=%f", myint.angle(myint.getx1(), myint.getx2(), myint.gety1(), myint.gety2()));
getch();
}
И вообще условие я немного не понимаю, чем отрезок отличается от линии, если в классе линия нужно задать координаты и начала, и конца? То есть в класс отрезок добавляются только методы вычисления угла и вывода данных, что ли...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2011, 20:08     Класс "линия" наследуется классом "отрезок"
Посмотрите здесь:

C++ Создать класс "точка" и производный класс "отрезок"
C++ Ошибка Необработанное исключение в "0x001d18f8" в "lr7v2.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde9"
C++ Необработанное исключение в "0x54a2d2e9 (msvcr100d.dll)" в "3.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Класс "Отрезок". Вычислить длину отрезка. C++
C++ Необработанное исключение в "0x76f015de" в "контрольная 1 задача 2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x334e2c64"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.04.2011, 21:12     Класс "линия" наследуется классом "отрезок" #2
Логически наследовать класс "отрезок" от класса "линия" неверно. Отрезок не является линией.

А ошибка возникает, видимо, на следующей строке.
C++
1
intercept myint;
Тут вызывается конструктор класса intercept без параметров. Которого в классе и нет вовсе. Потому и ошибка. Либо создавайте конструктор без параметров, либо задавайте параметры существующего конструктора при объявлении объекта класса.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
25.04.2011, 21:13     Класс "линия" наследуется классом "отрезок" #3
в классе intercept нету конструктора по умолчанию, о чем вам и пишет компилятор. Тем не менее на 51ой строке вашего кода вы пытаетесь создать объект
Alisson
1 / 1 / 0
Регистрация: 10.01.2011
Сообщений: 30
25.04.2011, 21:15  [ТС]     Класс "линия" наследуется классом "отрезок" #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
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
class Line
{
double _x1, _y1, _x2, _y2;
public: Line (double x1, double y1, double x2, double y2):
_x1(x1), _y1(y1), _x2(x2), _y2(y2)
{}
 
void setx1 (double n) {_x1=n;}
double getx1() {return _x1;}
void sety1 (double m) {_y1=m;}
double gety1() {return _y1;}
void setx2(double l) {_x2=l;}
double getx2() {return _x2;}
void sety2(double k) {_y2=k;}
double gety2() {return _y2;}
 
double Length (double x1, double y1, double x2, double y2)
{
double a, b, L;
a=pow ((x2-x1),2);
b=pow ((y2-y1), 1/2);
return L=a+b;
}
 
};
 
class intercept: public Line
{
double a1, b1, a2, b2;
public: intercept (double, double, double, double): Line (a1, a2, b1, b2)
{
}
//public: intercept () {} - так не получается :( Может я неправильно пробовала конструктор писать?
double angle(double, double, double, double)
{
double A;
A=1/(atan((a2-a1)/(b2-b1)));
return A;
}
void prin ()
{
printf("koordinatu nachala otrezka: x1=%f, \n", getx1());
printf("y1=%f, \n", gety1());
printf("koordinatu konza otrezka: x2=%f, \n", getx2());
printf("y2=%f, \n", gety2());
}
 
};
 
void main ()
{
clrscr();
intercept myint(0,0,0,0);
myint.setx1(13);
myint.sety1(9);
myint.setx2(4);
myint.sety2(1);
myint.prin();
printf ("dlina otrezka=%f", myint.Length (myint.getx1(), myint.gety1(), myint.getx2(), myint.gety2()));
printf ("ygol=%f", myint.angle(myint.getx1(), myint.getx2(), myint.gety1(), myint.gety2()));
getch();
}
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
25.04.2011, 21:21     Класс "линия" наследуется классом "отрезок" #5
C++
1
2
public: intercept ():a1(0), b1(0), a2(0), b2(0)
 {}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.04.2011, 21:34     Класс "линия" наследуется классом "отрезок" #6
C++
1
2
intercept (double, double, double, double): Line (a1, a2, b1, b2)
{}
Конструктор вызывает конструктор предка с параметрами собственных полей. Заполнены случайными значениями в памяти. Простите, но это безумие.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class intercept: public Line {
 public:
  intercept(double x1, double y1, double x2, double y2) : Line (x1, y1, x2, y2) {}
  intercept() : Line(0, 0, 0, 0) {}
  double angle() {
    return 1. / (atan((getx2() - getx1())/(gety2() - gety1())));
  }
  void print() {
    printf("koordinatu nachala otrezka: x1=%f, \n", getx1());
    printf("y1=%f, \n", gety1());
    printf("koordinatu konza otrezka: x2=%f, \n", getx2());
    printf("y2=%f, \n", gety2());
  }
};
Кто вообще вам такие примеры дает? Некорректно порождать класс отрезок от класса линия. Отсюда каша в голове и непонимание происходящего.

C++
1
2
3
4
5
intercept myint(0,0,0,0);
myint.setx1(13);
myint.sety1(9);
myint.setx2(4);
myint.sety2(1);
Для чего вызывать столько функций, если конструктор сам подставит нужные значения?
C++
1
intercept myint(13,9,4,1);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2011, 16:57     Класс "линия" наследуется классом "отрезок"
Еще ссылки по теме:

C++ Класс "Графический объект", от которого будут наследоваться классы "круг" и "квадрат"
C++ Иерархия классов "список"-"очередь", вызов метода через класс интерфейс
C++ Описать класс "Контейнер" как объект, предназначенный для транспортировки классов "Строительных блоков"

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

Или воспользуйтесь поиском по форуму:
Alisson
1 / 1 / 0
Регистрация: 10.01.2011
Сообщений: 30
26.04.2011, 16:57  [ТС]     Класс "линия" наследуется классом "отрезок" #7
"Конструктор вызывает конструктор предка с параметрами собственных полей. Заполнены случайными значениями в памяти. Простите, но это безумие." - Ну да, я понимаю, что здесь что-то не так, но как правильно, не знаю (и можно ли вообще как-то по-другому этот конструктор записать??)
"Кто вообще вам такие примеры дает? Некорректно порождать класс отрезок от класса линия. Отсюда каша в голове и непонимание происходящего." - Согласна, я не понимаю, зачем порождать класс "отрезок" от "линии", если это здесь одно и то же... но вот именно такое задание мне попалось...
"Для чего вызывать столько функций, если конструктор сам подставит нужные значения?" - Просто изначально планировала всё же с конструктором без параметров написать, и в мейне уже задать значения, а в данном случае действительно нелогично получилось ))

Добавлено через 18 часов 39 минут
Какой-то бред я вчера написала. Сразу не догадалась, что если создавать конструктор без параметров в классе-наследнике, то он обязательно должен быть и в базовом классе. Сегодня кое-что отредактировала, думаю сейчас уже код получше Но не уверенна, что у меня правильная формула нахождения угла. Кто-нибудь знает формулу действительно правильную? В интернете нахожу какие-то разные формулы, а какая из них правильная...
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
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
class Line
{
double x1, y1, x2, y2;
public:
Line(){}
Line (double x1, double y1, double x2, double y2):
x1(x1), y1(y1), x2(x2), y2(y2)
{}
void setx1 (double n) {x1=n;}
double getx1() {return x1;}
void sety1 (double m) {y1=m;}
double gety1() {return y1;}
void setx2(double l) {x2=l;}
double getx2() {return x2;}
void sety2(double k) {y2=k;}
double gety2() {return y2;}
 
double Length ()
{
double a, b, L;
a=pow ((x1-x2),2);
b=pow ((y1-y2),2);
return L=sqrt(a+b);
}
};
 
class intercept: public Line
{
public: intercept() {}
intercept (double a1, double a2, double b1, double b2): Line (a1, a2, b1, b2)
{
}
double angle()
{
double A;
return A=1/(atan((getx2()-getx1())/(gety2()-gety1())));
}
void prin ()
{
printf("koordinatu nachala otrezka: x1=%f, \n", getx1());
printf("y1=%f, \n", gety1());
printf("koordinatu konza otrezka: x2=%f, \n", getx2());
printf("y2=%f, \n", gety2());
}
};
 
void main ()
{
clrscr();
intercept myint;
myint.setx1(13);
myint.sety1(9);
myint.setx2(4);
myint.sety2(1);
myint.prin();
printf ("dlina otrezka=%f", myint.Length ());
printf ("ygol=%f", myint.angle());
getch();
}
Yandex
Объявления
26.04.2011, 16:57     Класс "линия" наследуется классом "отрезок"
Ответ Создать тему
Опции темы

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