С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 6

Проверка на корректность операции

31.07.2012, 20:50. Показов 1438. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Не знаю как лучше задать вопрос.
Смысл идеи таков:
Есть интерфейс типа данных (IVariable) и наследники от него, например: Number, Complex, Matrix.
Необходимо реализовать функцию сложения Sum(IVariable a, IVariable b), так чтобы можно было определить возможность сложения и вернуть значение IVariable суммы чисел.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "Math"
 
using namespace std;
 
int main (int argc, char ** args)
{
   Number a (5);
   Complex b (4,2);
   Matrix c (2,2);
   
   cout << a<<"+"<<b<<"="<<sum(a,b)<<endl;
   cout <<b<<"+"<<c<<"="<<sum(b,c)<<endl;
   return 1;
}
Результат:
Bash
1
2
5+4+2i=9+2i
4+2i+{2,2}=нельзя складывать эти типы.
На ум приходит только метод у интерфейса OperationCorrect(int /*Тип операции */, int /* Тип переменной */)
Тогда операцию сложения можно написать так:
C++
1
2
3
4
5
6
7
8
9
const int SUM=1;
IVariable sum(IVariable a, IVariable b)
{
 if(a.OperationCorrect(SUM,b.type)
     return a+b;
 if(b.OperationCorrect(SUM,a.type)
     return b+a;
 return new IErrorSum();
}
Может кто знает более интересней вариант.

P.S. Тип Number ничего не знает про тип Complex и Matrix,
тип Complex и Matrix знают про тип Number.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2012, 20:50
Ответы с готовыми решениями:

Проверка на корректность
Программа на консоли, для высчитывания логического выражения, подскажите, пожалуйста, как сделать обработку выражения на некорректный ввод,...

Считывание, проверка на корректность
Как считать uint64_t с клавиатуры, вывести на экран и проверить, что это именно неотрицательное целое число, а не double или char...

Проверка указателя на корректность
Есть у меня указатель class* test = new class(); И он в цикле вечно используется. Так вот как сделать проверку , что этот указатель на...

7
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
01.08.2012, 18:35
Можно, например, сделать метод интерфейса IVariable, который принимает единственный параметр - второй операнд суммы ли других операций.
Этот метод переопределить в разных классах. Каждый класс будет проверять, является ли переданный параметр известным ему типом (тип можно хранить как атрибут или просто проверять на dynamic_cast, первый вариант, все же думаю лучше). Это решение похоже на ваше, но оно позволяет не знать классам того, что можно не знать. Что более логично.
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 6
01.08.2012, 18:53  [ТС]
gooseim, спасибо что подтвердили мою теорию.
А что касается передачи одного параметра, то я наверно не до конца описал задачу, в дальнейшем потребуется переопределить *,/,- и тогда встанет вопрос как разделить, что операция Number*Matrix - является корректной, а Number+Matrix - нет.

Насколько я понимаю это единственный вариант?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.08.2012, 18:53
Вариант 1:
C++
1
bool TrySum(IVariable a, IVariable b,IVariable &result);// Возвращает успешность,если успешно результат заносит в result.
Вариант 2:
Реализовать свой класс исключений и ловить их при выполнении операций
C++
1
2
3
4
5
try
  { 
    c=sum(a,b);
  }
catch(myerror &e) { cerr<<e.what()<<endl; }
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
01.08.2012, 19:17
Tochka, когда будет другая операция, для нее будет другой виртуальный метод и т.д. Т.е. проверка должна осуществляться в методе операции. Причем в методе производного класса.

Добавлено через 22 минуты
Если делать проверку на валидность в базовом классе, мы нарушим идеологию ООП. Базовый класс не должен ничего знать о своих потомках. И потомки должны знать по минимуму друг о друге.
0
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 6
01.08.2012, 19:28  [ТС]
gooseim, может быть я что-то не понимаю, но я планировал перегрузить операторы вида
"operator Op (IVariable)", а так как, я заведомо не знаю какой тип стоит с лева, а какой с права то предполагал проверку на на знание типа (исходя из неё и переставлять местами элементы).

Avazart, исходя из вашей логики Number+Complex - будет выдавать ошибку, а Complex+Number - будет выдавать правильный вариант?

Добавлено через 2 минуты
Если делать проверку на валидность в базовом классе
В базовом классе будет только чисто виртуальная функция которая будет принимать два параметра, а в потомках необходимо будет её перегружать.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
01.08.2012, 19:28
Эта тема - прямо-таки классический пример ситуации, для которой придумали double dispatch.
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
01.08.2012, 19:54
Цитата Сообщение от Tochka Посмотреть сообщение
const int SUM=1; IVariable sum(IVariable a, IVariable b) { if(a.OperationCorrect(SUM,b.type) return a+b; if(b.OperationCorrect(SUM,a.type) return b+a; return new IErrorSum(); }
Такой вариант не покатит. Объект не являющийся IVariable не сможет вернуть сам себя и себе подобных как IVariable. Можно только IVariable& и const IVariable&. Либо сделать конструктор для IVariable для каждого типа. Это опять нарушение ООП. Принимать IVariable тоже не может.

В общем, походу нет красивого решения, как сделать, чтобы операция a + b возвращала тоже самое, что b + a, если b и a разного типа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2012, 19:54
Помогаю со студенческими работами здесь

Проверка строки на корректность
#include&lt;iostream&gt; #include&lt;cstring&gt; #include &lt;conio.h&gt; using namespace std; int main(){ char a; char a1; char a3; ...

Проверка на корректность входных данных
Нужно написать программу, которая бы проверяла строку на корректность. Допустимый формат вот такой +7 (233) 555-11-22. Как это сделать? В...

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

Префиксное дерево, проверка на корректность
Доброго времени суток, Пишу собственный набор функций для работы с префиксным деревом, но наткнулся на небольшие проблемы. #include...

Проверка на корректность логического выражения
Добрый вечер. На входе имеем логического выражение которое может содержать : 1. константы : 0 или 1 2. скобки : () 3....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru