Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
1

Шаблонный класс

07.11.2013, 13:39. Просмотров 759. Ответов 11
Метки нет (Все метки)

День добрый. Пишу матричный калькулятор на шаблонном классе. Хочу добиться того, чтобы можно было оперировать с матрицами всех численных типов. Для 1 типа класс отлажен и работает хорошо, но, когда переделал под все типы, всё пошло наперекосяк. И первый вопрос в том как произвести действие над объектами разных классов и можно-ли вообще? К примеру обращение матрицы. Ввожу целочисленную, но функция должна возвращать вещественную.
Когда вызываю функцию обращения матрицы для уже созданного объекта типа double, куда будет записан результат, и в качестве параметра передаю объект класса типа int, то происходит несоответствие типов. Подскажите как с этим справиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2013, 13:39
Ответы с готовыми решениями:

Класс Matrix: реализовать шаблонный класс для двумерных массивов
Доброго времени суток. У меня вопрос: я создал класс Array со внутренним...

Шаблонный класс и класс одномерный массив
Задание: протестировать класс шаблон, с обычными типами данных я понял как...

Переделать класс в шаблонный класс
Как данный процесс проделать? Я попробовал так по синтаксису из учебника:...

Шаблонный класс
Создание шаблона класса с 1 параметром типа ( шаблонный класс ) По типу :...

Шаблонный класс
Ребята, объясните пожалуйста, как работает шаблонный класс, своими словами, на...

11
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 13:50 2
Цитата Сообщение от Arkaniy Посмотреть сообщение
И первый вопрос в том как произвести действие над объектами разных классов и можно-ли вообще?
если конкретно про матрицы, то почему нет. Думаю, что вполне можно. Как минимум можно в шаблонный класс добавить шаблонный конструктор, который будет думать, что входной параметр является матрицей другого типа и будет пытаться поэлементно ее скопировать в свой тип.
Аналогично можно реализовать и другие действия.
Для подробности в ответе нужно больше конкретики в вопросе. Например, куски кода
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
07.11.2013, 14:04  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
matrix(int s_m,int s_n,int set):m(s_m),n(s_n)
    {
        mass=new type*[m];
        for(int i=0;i<m;i++)
            mass[i]=new type[n];
        if(set)set_mass();
        else
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                    mass[i][j]=0;
    }
Собственно, конструктор. Первые 2 параметра это кол-во строк и столбцов, а третий определяет как вводится матрица: 1-пользователем, 0-забивается нулями.

C++
1
2
rev=new matrix<double>(m,n,0);
*rev=rev->revers(*a1);
Тут в rev должна возвратиться матрица обратная а1. а1 типа интеджер. Здесь-то и происходит несоответствие.
Тут конечно можно попробывать пойти по-другому и вызывать функцию обращения из а1 без параметра, а записывать уже в rev. Но как быть, если складываю разные типы? Просто перед созданием объекта определять тип результирующей матрицы через условие? Хочется сделать без этого.
0
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 14:12 4
C++
1
*rev=rev->revers(*a1);
явно что-то не так в королевстве датском
если реверс является методом класса матрица, то использоваться он должен так
C++
1
matrix_name.revers();
все. никаких параметров. никаких возвращаемых значений

иначе делать метод реверса статическим или вообще отдельной функцией, тогда
C++
1
matrix::reverse(matrix_name);
Если сделать правильные методы, то тогда вопрос сведется к такому
C++
1
2
3
4
matrix<int> int_matrix(m, n, 0);
matrix<double> double_matrix(m, n, 0);
//... какие-то действия
double_matrix = int_matrix; // и вот тут будет ошибка
Чтобы убрать эту ошибку, нужно определить оператор присваивания и, заодно, конструктор копии, которые будут принимать на вход матрицу какого-то типа T
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
07.11.2013, 16:56  [ТС] 5
С этим пока понял.
Вот еще вопрос. Каким образом можно определить тип вводимого значения? То есть чтобы компьютер сам определял объект какого типа ему создавать.
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
07.11.2013, 17:22 6
Arkaniy, Простите, что? Вместо компьютер надо понимать компилятор? Никак, где-то в программе на этапе компиляции должен быть известен тип данных.
0
I.M.
567 / 550 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 17:54 7
Не понял вопроса. Типы в шаблонах выводятся компилятором на этапе компиляции самостоятельно или с помощью программиста.
Давайте код и по нему вопрос, связанный с типами
0
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
08.11.2013, 13:15  [ТС] 8
ForEveR, Вы правы, имел ввиду именно компилятор.
Сейчас отходя от темы матриц такой вопрос. Допустим, есть возможность создать объект шаблонного класса тремя разными типами(int,double,char). Вопрос в том как сообщить компилятору объект какого типа ему создавать если этот тип явно не определяется? То есть если пользователь начал вводить буквы, то создается char, если целые числа-int, дробные-double.
Я думал использовать стринг и после введенной строки проверять каждый символ. Такой подход вменяемый или возможно по-другому?
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.11.2013, 13:24 9
Arkaniy, Только так и можно. Определять придется неким свитчем по типам.
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
08.11.2013, 13:35  [ТС] 10
ForEveR, спасибо, с этим понял.
Уже пытался так сделать, но застрял на том, чтобы написать вот так
C++
1
2
3
4
5
6
7
typename type;
......
switch(key)
{
    case'i':type=int; break;
    case'd':type=double; break;
}
где в key записан условный символ типа, который нужно будет использовать. Вариант с typename type; не прокатит, я уже понял.
Так собственно каким образом это реализовать?
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.11.2013, 13:48 11
Arkaniy, Так не получится очевидно. Написать перегрузки например. Или просто сразу создать тот шаблон который нужно и работать с ним.
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
#include <iostream>
 
template<typename T>
class variable
{
public:
   void execute() { (void)(T() % 10); }
};
 
template<>
void variable<double>::execute() { }
 
int main()
{
   char value = 0;
   std::cin >> value;
   switch (value)
   {
   case 'i':
      variable<int> ivar;
      ivar.execute();
      break;
   case 'd':
      variable<double> dvar;
      dvar.execute();
      break;
   }
}
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
08.11.2013, 13:52  [ТС] 12
ForEveR, снова спасибо
Очень помогли, буду пробывать.
0
08.11.2013, 13:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2013, 13:52

Шаблонный класс
Доброго времени суток. Опять пишу здесь(( помогите ребятки.Сидел много над...

Шаблонный класс
Я запутался с шаблонами. Не пойму никак как вызвать конструктор с введенным в...

Шаблонный класс
Ребят, прошу Вашей помощи.. Программу я написала.. Она работает. Но теперь...


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

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

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