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

Как узнать, какого типа объект находится по указателю - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нужна помощь , помогите переделать несложную программу с C# на C++ http://www.cyberforum.ru/cpp-beginners/thread528775.html
Нужна помощь , помогите переделать несложную программу с C# на C++ using System; namespace ConsoleApplication1 { class Program {
C++ шаблонная функция Создать шаблонную функцию, изменяющую попарно элементы массива следующим образом: первый элемент будет равняться сумме пары, а второй разности пары. На пример: список - 0 2 3 4 3 6, результат 2 –2 7 –1 9 –3. свои наработки потерял, если найду выложу..... http://www.cyberforum.ru/cpp-beginners/thread528768.html
C++ Напишите программу, которая сравнивает ответ пользователя на вопрос с правильным ответом.
Напишите программу, которая сравнивает ответ пользователя на вопрос с правильным ответом.
C++ задание со строкой и массивами. C++.
Добрый вечер всем. Помогите пожалуйста! Надо написать программу, которая просит пользователя ввести строку. Прочитать строку и разбить на два массива - один с символами соответствующими цифрам, другой с символами соответствующими буквам. Остальные символы "выбросить". Массив должен быть отсортирован по возрастанию, например (AAaacsstux или 11234489). Перед вставкой в массив, символы, которые...
C++ С++ - с какой книги начать и в каком ide прорабатывать примеры http://www.cyberforum.ru/cpp-beginners/thread528757.html
Решил я заняться изучением С++, на начальном этапе всегда нужна помощь от опытных людей. На данный момент у меня стоят IDE С++ Builder 6 и XE, а также Visual c++ 2010 Express. Скачал несколько книг по С++, просмотрел везде введения, тип изложения, наличия примеров итп итд. Остановился на Прата С. "Язык программирования С++. Лекции и упражнения", Конечно хотелось прочитать и Страуструпа, т.к...
C++ добавить в программу использование функций #include "stdafx.h" #include <iostream> #include <cmath> using namespace std; const int ss=80; int main() { setlocale (LC_ALL, "Russian"); int n, i, j=-1, q=0, d=0, a, sum=0, b=0; подробнее

Показать сообщение отдельно
hoggy
6437 / 2655 / 460
Регистрация: 15.11.2014
Сообщений: 5,844
Завершенные тесты: 1
21.02.2015, 01:03     Как узнать, какого типа объект находится по указателю
Цитата Сообщение от Завернин Посмотреть сообщение
Лучше рассмотреть на конкретной задаче:
Есть 2 контура Contour, состоящих из последовательно соединенных линий Line: Element и дуг Arc: Element.
Нам нужно найти точки пересечения этих контуров.
Пускай для простоты будет не линия, а отрезок.

Нужно отталкиваться от "способа обобщения".

Что у нас есть?
Контур, который может состоять из линий, дуг, и может быть ещё чего нибудь придумаем.

Что общего у отрезков и дуг?

Если мы можем выделить общее у этих двух элементов, например:
"отрезок - это примитив состоящий из 2х точек"
"дуга - это примитив состоящий из И отрезков"

Пойдем дальше в нашем обобщении:
отрезок - это контейнер для двух точек

Но если так,
то совокупность отрезков можно представить в виде списка точек.

А значит дуга - это контейнер из И точек.
И по аналогии, контур - это так же контейнер из N точек.

Итого: вся архитектура сводится всего к двум элементам: точка, и контейнер точек.

Дуги, отрезки, квадраты, прямоугольники и прочее - это все опционально.
Всего лишь методы "удобного и быстрого" построения типичных фигур:

C++
1
2
3
4
5
6
7
8
//получили дугу из N точек
auto arc = Figure::create<Arc>(param1);
 
//получили отрезок
auto line = Figure::create<Line>(param2);
 
//получили замкнутую фигуру из одной дуги и одного отрезка
auto fugure = (arc + line).close();
Очевидно, что при таком обобщении достаточно одного единственного алгоритма
поиска пересечений для фигур состоящих из И точек.


Если не ошибаюсь, то в мире компьютерной графики принцип разбиения
любых геометрических фигур на многоугольники называется "адаптивной деградацией".

---------------------------------------------------------------------------------------------

Теперь предположим, что в силу специфики задачи мы не можем прибегнуть к адаптивной деградации
Предположим, нам нужно делать весьма точные расчеты,
и оперировать нужно именно окружностями и настоящими дугами, а вовсе не многоугольниками.
(предположим, что так захотел заказчик, и баста! )

В этом случае становится очевидным,
что сделать универсальный алгоритм пересечения не получится.

И придется реализовать весь комплект уникальных алгоритмов пересечений.
Что само по себе уже нарушает идею "закрыт для изменений, открыт для расширений".

Требование к задаче "выполнять обработку по уникальным способом в зависимости от типов участников",
уже противоречит идее полиморфизма.

И с этим мы бессильны, что либо поделать.
Мы можем лишь облегчить сопровождение такого подхода.

Например, мы можем построить решение,
которое частично может поспособствовать универсальности решения.

Допустим, если линия не умеет пересекаться с окружностью
(программисты ещё не успели доделать этот алгоритм,
но уже сейчас нужно показать промежуточные результаты работы),
то линия может попросить окружность "адаптивно деградироваться",
и в итоге отработает универсальный алгоритм.

Кроме того, вместо свитч-кейсов и армии ифов,
мы можем задействовать более быстрый вариант выборки "кто-с-кем" основанный на полиморфизме.
Что ко всему прочему позволит выполнять проверку типобезопасности времени компиляции.

И этот фактор очень важен, поскольку избавляет нас от использования медленного динамик_каст,
медленных свитч-кейсов, медленных ифов,
упрощает расширение системы,
и в конечном счете ошибки времени компиляции - это всегда лучше, чем ошибки рантайма.
Ничайно позабыть что-то уже не получится.

Я не буду вдаваться в подробности модели самого контейнера графических элементов.
В контексте нашей беседы главное - продемонстрировать диспетчеризацию.

Ниже представленный код - пример-иллюстрация одного из возможных решений:

http://rextester.com/JAIUXZ12714

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
#include <string>
#include <typeinfo>
#include <iostream>
using namespace std;
 
struct Circle;
struct Line;
struct Arc;
 
struct Element
{
    virtual void Intersect(Element& Object) = 0;
 
    virtual void Collision(Element&) = 0;
    
    //--- элементы не обязаны уметь обрабатывать данный тип фигуры
    // если они не определили алгоритм обработки - 
    // будет задействован универсальный алгоритм с применением адаптивной деградации
    virtual void Collision(Circle& el);
 
    virtual void Collision(Line&) = 0;
    virtual void Collision(Arc&) = 0;
 
    static void Collision(Line&, Line&)
        { cout << "intersection: line vs line\n";     }
    static void Collision(Line&, Arc&)
        {  cout << "intersection: line vs arc\n";     }
    static void Collision(Arc&, Arc&)
        { cout << "intersection: arc vs arc\n";       }
    static void Collision(Circle&, Circle&)
        { cout << "intersection: circle vs circle\n"; }
 
    template<class T>
    static void Collision(Circle&, T&)
        { cout << "circle vs figure with adaptive degradation...\n"; }
 
    
 
    
};
 
struct Line : Element
{
    //--- если срабатывает метод, принимающий базовый элемент
    // значит данная фигура не знает уникального алгоритма обработки
    // фактического типа этого элемента
    // в этом случае задействуется универсальный алгоритм 
    // с использованием адаптивной деградации
    virtual void Collision(Element&)
        { cout << "line vs figure with adaptive degradation...\n";  }
 
    virtual void Collision(Line& l)
        { Element::Collision(*this, l); }
    virtual void Collision(Arc& a)
        { Element::Collision(*this, a); }
    virtual void Intersect(Element& object)
        { object.Collision(*this); }
};
 
struct Arc : Element
{
    virtual void Collision(Element&)
        { cout << "arc vs figure with adaptive degradation...\n"; }
 
    virtual void Collision(Line& l)
        { Element::Collision(l, *this); }
    virtual void Collision(Arc& a)
        { Element::Collision(*this, a); }
    virtual void Intersect(Element& object)
        { object.Collision(*this); }
};
 
struct Circle : Element
{
    virtual void Collision(Element&)
        { cout << "circle vs figure with adaptive degradation...\n"; }
 
    virtual void Collision(Line& l)
        { Element::Collision(*this, l); }
    virtual void Collision(Arc& a)
        { Element::Collision(*this, a); }
    virtual void Collision(Circle& c)
        { Element::Collision(*this, c); }
    virtual void Intersect(Element& object)
        { object.Collision(*this); }
};
 
 
void Element::Collision(Circle& el)
{
    Collision(static_cast<Element&>(el));
}
 
int main()
{
    Line   line;
    Arc    arc;
    Circle cir;
 
    line.Intersect(line);
    line.Intersect(arc);
    arc.Intersect(arc);
    arc.Intersect(line);
 
    cout << "--------------------------\n";
 
    cir.Intersect(line);
    cir.Intersect(arc);
    cir.Intersect(cir);
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru