Форум программистов, компьютерный форум 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; подробнее

Показать сообщение отдельно
Завернин
1 / 1 / 0
Регистрация: 22.12.2013
Сообщений: 27
20.02.2015, 21:47
Цитата Сообщение от hoggy Посмотреть сообщение
Более того: именно к вам можно обратить ваш собственный тезис:
С точки зрения ООП ваш юзкейс нарушает идеому "зарыт для изменений, открыт для расширений",
Согласен, принцип открытости-закрытости может нарушаться в абстрактных коллекциях.
С теоретической точки зрения да, если нам нужна динамическая типизация, то мы не соблюдаем этот принцип.

Но программирование прежде всего имеет смысл с точки зрения практики.
И не спроста язык предлагает нам инструменты динамической типизации вроде dinamic_cast и typeid.
Можно обойтись и без таких коллекций, только это усложнит реализацию.

Лучше рассмотреть на конкретной задаче:
Есть 2 контура Contour, состоящих из последовательно соединенных линий Line: Element и дуг Arc: Element.
Нам нужно найти точки пересечения этих контуров.

Архитектурное решение с применением абстрактных коллекций: Перечисляем элементы первого контура, для каждого из них перечисляем все элементы второго контура и вызываем у них метод PointF pf = el1.Intersect(el2);
В методе Intersect каждого типа пишем свич-кейсы. Нарушаем принцип открытости-закрытости (при добавлении новых типов примитивов придется дописывать свич-кейсы в каждом "братском" классе), но простота реализации и поддержки, а также скорость выполнения программы при большом количестве элементов (касты делаются быстро, по крайней мере на C#).

Какую можете предложить альтернативу? (Естественно в приватных функциях контура должны сохраняться возможности вставки, удаления, инверсии элементов, и желательно доступа к элементу по индексу).

Добавлено через 39 минут
Архитектурное решение с применением абстрактных коллекций: Вызываем метод cont1.Intersect(cont2); Перечисляем элементы первого контура, приводим к производному типу. Для каждого из них перечисляем все элементы второго контура, приводим их и вызываем метод PointF pf = (line1/arc1).Intersect(line2/arc2);
Все свич-кейсы пишутся в методе Contour.Intersect. При добавлении новых типов примитивов, нужно будет дописать свич кейсы только этого метода, а ранее написанный код примитивов останется без изменений.
В такой реализации не нарушается принцип открытости-закрытости, но остается простота реализации и поддержки, а также скорость выполнения программы при большом количестве элементов (касты делаются быстро, по крайней мере на C#).

А вот избавиться от динамической типизации вряд ли получится. Отказываться от абстрактной коллекции тоже смысла не вижу и не считаю это ущербным. В принципах ООП ничего нет про ущербность абстрактных коллекций=)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru