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

Шаблонный класс - C++

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

C++ Шаблонный класс
Переделать класс в шаблонный класс C++
C++ Шаблонный класс
C++ Шаблонный класс
Шаблонный класс Множества C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 13:50     Шаблонный класс #2
Цитата Сообщение от Arkaniy Посмотреть сообщение
И первый вопрос в том как произвести действие над объектами разных классов и можно-ли вообще?
если конкретно про матрицы, то почему нет. Думаю, что вполне можно. Как минимум можно в шаблонный класс добавить шаблонный конструктор, который будет думать, что входной параметр является матрицей другого типа и будет пытаться поэлементно ее скопировать в свой тип.
Аналогично можно реализовать и другие действия.
Для подробности в ответе нужно больше конкретики в вопросе. Например, куски кода
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
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. Но как быть, если складываю разные типы? Просто перед созданием объекта определять тип результирующей матрицы через условие? Хочется сделать без этого.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 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
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
07.11.2013, 16:56  [ТС]     Шаблонный класс #5
С этим пока понял.
Вот еще вопрос. Каким образом можно определить тип вводимого значения? То есть чтобы компьютер сам определял объект какого типа ему создавать.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.11.2013, 17:22     Шаблонный класс #6
Arkaniy, Простите, что? Вместо компьютер надо понимать компилятор? Никак, где-то в программе на этапе компиляции должен быть известен тип данных.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
07.11.2013, 17:54     Шаблонный класс #7
Не понял вопроса. Типы в шаблонах выводятся компилятором на этапе компиляции самостоятельно или с помощью программиста.
Давайте код и по нему вопрос, связанный с типами
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
08.11.2013, 13:15  [ТС]     Шаблонный класс #8
ForEveR, Вы правы, имел ввиду именно компилятор.
Сейчас отходя от темы матриц такой вопрос. Допустим, есть возможность создать объект шаблонного класса тремя разными типами(int,double,char). Вопрос в том как сообщить компилятору объект какого типа ему создавать если этот тип явно не определяется? То есть если пользователь начал вводить буквы, то создается char, если целые числа-int, дробные-double.
Я думал использовать стринг и после введенной строки проверять каждый символ. Такой подход вменяемый или возможно по-другому?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.11.2013, 13:24     Шаблонный класс #9
Arkaniy, Только так и можно. Определять придется неким свитчем по типам.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
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; не прокатит, я уже понял.
Так собственно каким образом это реализовать?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
   }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2013, 13:52     Шаблонный класс
Еще ссылки по теме:

Шаблонный класс C++
C++ Шаблонный класс
C++ шаблонный класс

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

Или воспользуйтесь поиском по форуму:
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
08.11.2013, 13:52  [ТС]     Шаблонный класс #12
ForEveR, снова спасибо
Очень помогли, буду пробывать.
Yandex
Объявления
08.11.2013, 13:52     Шаблонный класс
Ответ Создать тему
Опции темы

Текущее время: 17:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru