Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78

Ошибка в программу

05.06.2016, 19:24. Показов 1110. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, изучаю полиморфизм, пишу программу, столкнулся с такой ошибкой.
Имеется абстрактный класс, 3 дочерних.
Figure.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
#pragma once
 
//Структура для хранения точек
struct Point{
    int x, y;
 
    Point() : x(0), y(0){}
    Point(int xC, int yC) : x(xC), y(yC){}
 
    Point& operator= (const Point &v){
        x = v.x;
        y = v.y;
        return *this;
    }
};
 
///абстрактный класс
class figure{
public:     
    virtual double area() = 0; //площадь фигуры
    virtual bool intersect(figure &f) = 0; //пересечение
protected:
    Point v; //исходные координаты фигур 
};
Circle.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
#include "Figure.h"
#include "Rectangle.h"
#include "Triangle.h"
 
class circle : public figure{
public:
        
    circle() { Point(); radius = 0; }
    circle(Point aC, int rC) { a = aC; radius = rC; }
    
    double area();
 
    bool intersect(rectangle& rect);
    bool intersect(triangle& tria); 
    bool intersect(figure& fig);
    
public: 
    Point a;
    int radius; //третья вершина
};
Когда компилирую программу, то появляется ошибка,что в классе Circle не идентифицированны rectangle и triangle, хотя все библиотеки подключены,в чём проблема?В каждом дочернем классе такая ошибка, но для краткости показал только один.Если ещё что потребуется, могу выложить.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2016, 19:24
Ответы с готовыми решениями:

Открыл данную программу на другом компьютере, она не запустилась. Выходит такая ошибка " Ошибка инициализации
Я по этой ссылке http://basicsprog.ucoz.ru/publ/6-1-0-17 разработал МП3-Плеер, сделал все как надо, все работало на УРа, но потом когда...

Скомпилировал программу и ошибка
Скомпилировал программу и ошибка 0xc0000022. Как исправить? Программу прикрепил. Помогите пожалуйста! В плюсах выложили файл с...

написал программу, ошибка!
Info :Compiling C:\BC5\BIN\zadacha 3.cpp Warn : zadacha 3.cpp(25,3):'c' is assigned a value that is never used вот такая ошибка...

9
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.06.2016, 19:41
Лучший ответ Сообщение было отмечено Whoops как решение

Решение

То что в ситуации "класс А использует класс Б, а класс Б использует класс А" нужно опережающее объявление классов.
C++
1
2
3
4
5
class rectangle;
class triangle;
class figure
{
    ...
1
 Аватар для Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78
05.06.2016, 19:46  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
То что в ситуации "класс А использует класс Б, а класс Б использует класс А" нужно опережающее объявление классов.
C++
Выделить код
1
2
3
4
5
class rectangle;
class triangle;
class figure;
{
...
Где именно объявлять? Объявлял в Figure.h, в Circle.h, в главном(где функция main()), но ошибка осталась.
0
 Аватар для stzer
140 / 110 / 60
Регистрация: 26.10.2013
Сообщений: 314
05.06.2016, 19:48
Лучший ответ Сообщение было отмечено Whoops как решение

Решение

Для начала приведите код в порядок.
1. struct в С++ используется только для голых данных, Point должен быть классом, причем не забудьте про инкапсуляцию.
2. Класс, который проектируется для того, чтобы быть базовым, должен содержать виртуальный деструктор. Все классы, которые наследуют базовый, в котором есть чисто виртуальные функции, должны их реализовать.
3. Зачем в классе circle объявлен Point a? В базовом классе уже есть Point v.
4. circle() { Point(); radius = 0; } наигрубейшая ошибка. Тут попробуйте разобраться сами, потом напишите о результатах.
5.
C++
1
circle(Point aC, int rC) { a = aC; radius = rC; }
и
C++
1
Point(int xC, int yC) : x(xC), y(yC){}
Используйте инициализацию всегда, когда это возможно.
6.
C++
1
2
3
 bool intersect(rectangle& rect);
             bool intersect(triangle& tria); 
             bool intersect(figure& fig);
Так и не понял назначение этих функций. Нам нужен полиморфизм! Вы, видимо, не понимаете его сути.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.06.2016, 19:56
Цитата Сообщение от Whoops Посмотреть сообщение
Где именно объявлять? Объявлял в Figure.h, в Circle.h, в главном(где функция main()), но ошибка осталась.
По идее, в Figure.h, до объявления дочерних классов. Если не помогает, тогда следующий вопрос - у вас к cpp файлам все эти заголовки подключены?
1
 Аватар для Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78
05.06.2016, 20:02  [ТС]
stzer, спасибо за замечания, буду исправлять, первый мой проект довольно крупный для меня. Полиморфизм упомянул скорее зря, я подумал, что проблема в абстрактном классе.
А эти функции проверяют пересечения фигур между собой.
0
 Аватар для stzer
140 / 110 / 60
Регистрация: 26.10.2013
Сообщений: 314
05.06.2016, 20:05
Whoops, покажите все файлы, и "засуньте" их в спойлер.
1
 Аватар для Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78
05.06.2016, 20:13  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Если не помогает, тогда следующий вопрос - у вас к cpp файлам все эти заголовки подключены?
Видимо в этом и была ошибка. Можно ещё такой вопрос?
Если убрать эту строку из Circle.h
C++
1
bool intersect(figure& fig);
то в main'e, при объявление переменной
C++
1
circle ball;
- возникает ошибка.
Её не будет, если закомментить строку из абстрактного класса:
C++
1
virtual bool intersect(figure &f) = 0; //пересечение
А если её оставить, то возникает куча ошибок,судя по описанию она требует реализацию в каждом классе.Почему так?Видимо мой код очень крив и не гибок.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.06.2016, 20:16
Цитата Сообщение от Whoops Посмотреть сообщение
А если её оставить, то возникает куча ошибок,судя по описанию она требует реализацию в каждом классе.Почему так?
Потому что =0 означает что у предка этой самой реализации нет. А она должна быть. Если не у предка, так хоть у потомков.
1
 Аватар для Whoops
21 / 7 / 3
Регистрация: 29.08.2014
Сообщений: 78
05.06.2016, 20:19  [ТС]
main()
Кликните здесь для просмотра всего текста
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>
#include <vector>
#include "Figure.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Triangle.h"
#include "InterCircle.h"
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Rus");
        
    vector<figure*> shape;      
    circle ball;
    rectangle rect;
    triangle tria;  
    Point a, b, c, d; //точки
    int rad; //радиус
 
    cout << "Введите координаты для окружности: " << endl;
    cout << "X = "; cin >> a.x;
    cout << "Y = "; cin >> a.y;
    cout << "Радиус = "; cin >> rad;
    ball = { a, rad };
    
    cout << "\nВведите координаты для треугольника: " << endl;
    cout << "Точка 1\nX = "; cin >> a.x;
    cout << "Y = "; cin >> a.y; 
    cout << "Точка 2\nX = "; cin >> b.x;
    cout << "Y = "; cin >> b.y; 
    cout << "Точка 3\nX = "; cin >> c.x;
    cout << "Y = "; cin >> c.y;
    tria = { a, b, c }; 
 
    cout << "\nВведите координаты для прямоугольника: " << endl;
    cout << "Точка 1(лево - верх): " << endl;
    cout << "X = "; cin >> a.x;
    cout << "Y = "; cin >> a.y;
    cout << "\nТочка 2(лево - низ): " << endl;
    cout << "X = "; cin >> b.x;
    cout << "Y = "; cin >> b.y; 
    cout << "\nТочка 3(право- верх): " << endl;
    cout << "X = "; cin >> c.x;
    cout << "Y = "; cin >> c.y;
    cout << "\nТочка 4(право - низ): " << endl;
    cout << "X = "; cin >> d.x;
    cout << "Y = "; cin >> d.y;
    rect = { a, b, c, d};
 
    shape.push_back(&ball);
    shape.push_back(&tria);
    shape.push_back(&rect);
    
    //Вычисление площади каждой фигуры
    for (int i = 0; i != shape.size(); ++i){
        shape[i]->area(); 
    }
 
    //ball.intersect(rect);
    
    cout << ball.intersect(rect) << endl;
    
 
     return 0;
}

Figure.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
#pragma once
 
//Структура для хранения точек
class triangle;
class circle;
class rectangle;
 
struct Point{
    int x, y;
 
    Point() : x(0), y(0){}
    Point(int xC, int yC) : x(xC), y(yC){}
 
    Point& operator= (const Point &v){
        x = v.x;
        y = v.y;
        return *this;
    }
};
 
///абстрактный класс
class figure{
public:     
    virtual double area() = 0; //площадь фигуры
    virtual bool intersect(figure &f) = 0; //пересечение
protected:
    Point v; //исходные координаты фигур 
};

Circle.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include "Figure.h"
#include "Rectangle.h"
#include "Triangle.h"
 
 
class circle : public figure{
public:
        
    circle() { Point(); radius = 0; }
    circle(Point aC, int rC) { a = aC; radius = rC; }
    
    double area();
 
    bool intersect(rectangle& rect);
    bool intersect(triangle& tria); 
    bool intersect(figure& fig);
    
public: 
    Point a;
    int radius; //третья вершина
};

Circle.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
#pragma once
#include <iostream>
#include "Circle.h"
#include "Rectangle.h"
#include "Triangle.h"
#include "Figure.h"
#include "InterCircle.h"
 
 
const double PI = 3.141592;
 
double circle::area(){
    std::cout << "Площадь круга = " << PI * radius * radius << std::endl;
    return PI * radius * radius;
}
 
 
bool circle::intersect(rectangle& rect){
 
    Point point_first = rect.a;
    Point point_second = rect.b;
    return InterCircle(point_first, point_second, *this);
}

InterCircle.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
#pragma once
#include "Circle.h"
#include "Rectangle.h"
#include <iostream>
#include "Figure.h"
 
bool InterCircle(Point& a, Point& b, circle& ball){
 
    a.x -= ball.a.x;
    a.y -= ball.a.y;
    b.x -= ball.a.x;
    b.y -= ball.a.y;
 
    double dx = b.x - a.x;
    double dy = b.y - a.y;
 
    //составляем коэффициенты квадратного уравнения на пересечение прямой и окружности.
    //если на отрезке [0..1] есть отрицательные значения, значит отрезок пересекает окружность
    double a1 = dx*dx + dy*dy;
    double b1 = 2.0*(a.x*dx + a.y*dy);
    double c1 = a.x*a.x + a.y*a.y - ball.radius * ball.radius;
 
    if (-b1 < 0)
        return (c1 < 0);
 
    if (-b1 < (2.0*a1))
        return ((4.0*a1*c1 - b1*b1) < 0);
 
    return (a1 + b1 + c1 < 0);
}

Остальное не имеет смысла выкладывать,всё тоже самое,но не доделанное.

Добавлено через 2 минуты
Спасибо вам большое, выложил остальные файлы, приму советы о том,что исправить или как лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2016, 20:19
Помогаю со студенческими работами здесь

Закрываю программу и возникает ошибка
Здравствуйте! Пишу простенькие программки в CodeGear C++ Builder 2007, программки беру из учебников. В некоторых программках возникает...

Написал программу, а в ней ошибка
Написал программу, а в ней ошибка. Функция z=e^(1.5*x) +y^1.5 вот сам код программы: program z34; var z,y,x,e:real; i,j:integer; ...

Свернуть программу в трей. Ошибка.
Люди вообщем пишу программу которая получает информацию с сайта и выводит ее в трее при наведении мышки на значок, а так же при нажатии на...

Ошибка при вводе данных в программу
помогите, пжлста, ошибка при выводе(прога читает и выводит записи+создает новые) возможно из-за klient :gscratch: спасибо ...

пишу программу где то ошибка исправте
y=sin^3(x^2+a)6^2-(x/b)^1/2 a=1.1 b=0.004 x=0.2 procedure TForm1.Button1Click(Sender: TObject); var y,x,a,b,n,m,c,d:integer; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru