Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 31.07.2012
Сообщений: 6
1

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

31.07.2012, 20:50. Просмотров 711. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2012, 20:50
Ответы с готовыми решениями:

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

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

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

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

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

Насколько я понимаю это единственный вариант?
0
Эксперт С++
8302 / 6056 / 602
Регистрация: 10.12.2010
Сообщений: 28,148
Записей в блоге: 26
01.08.2012, 18:53 4
Вариант 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 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
01.08.2012, 19:17 5
Tochka, когда будет другая операция, для нее будет другой виртуальный метод и т.д. Т.е. проверка должна осуществляться в методе операции. Причем в методе производного класса.

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

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

Добавлено через 2 минуты
Если делать проверку на валидность в базовом классе
В базовом классе будет только чисто виртуальная функция которая будет принимать два параметра, а в потомках необходимо будет её перегружать.
0
Эксперт С++
1659 / 1031 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
01.08.2012, 19:28 7
Эта тема - прямо-таки классический пример ситуации, для которой придумали double dispatch.
0
Эксперт С++
516 / 420 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
01.08.2012, 19:54 8
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2012, 19:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.