0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 33
1

Создать шаблонный класс и наследованный от этого класса метод

28.04.2015, 16:35. Показов 2066. Ответов 25
Метки нет (Все метки)

Создать шаблонный класс и наследованный от этого класса метод(естественно шаблонный), реализовать его в int main(){} через INT и Double.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2015, 16:35
Ответы с готовыми решениями:

Создать класс, наследованный от предыдущего
Задача: Разработать класс SortedArray - упорядоченный массив целых чисел, наследованный от класса...

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО!
Друзья! Почему так? #include <windows.h> #include <iostream> using namespace std; //Вот...

Чем отличается шаблонный метод класса от шаблонного класса?
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок...

Шаблонный метод класса
Имеется следующая ситуация: template <class T> class Array : public...

25
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.04.2015, 16:41 2
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename T>
class A {};
 
template <typename T>
class B : A<T> {};
 
int main()
{
    B<int> b1;
    B<double> b2;
}
0
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 33
08.05.2015, 15:45  [ТС] 3
шаблонный класс и наследованный от этого класса метод(естественно шаблонный), реализовать его в int main(){} через INT и Double ( это может быть поиск max числа, или разность max и min и т д)
0
0 / 0 / 0
Регистрация: 09.05.2015
Сообщений: 14
09.05.2015, 16:11 4
нужно создать шаблонный класс и наследованный от этого класса метод(естественно шаблонный), реализовать его в int main(){} через INT и Double.Помогите пожалуйста!!!
0
0 / 0 / 0
Регистрация: 06.03.2015
Сообщений: 80
10.05.2015, 09:47 5
создать шаблонный класс и наследованный от этого класса метод(естественно шаблонный), реализовать его в int main(){} через INT и Double( можно реализовать:поиск max числа, поиск разницы между max и min и т.д)
0
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
10.05.2015, 09:59 6
Цитата Сообщение от Ami123 Посмотреть сообщение
наследованный от этого класса метод
Вы уверены, что задание звучит именно так?

Цитата Сообщение от Ami123 Посмотреть сообщение
реализовать его в int main(){} через INT и Double
Использовать в main с типами int и double?

И какое ТЗ всё же? Что сей шаблонный класс с методом должен делать?
0
0 / 0 / 0
Регистрация: 06.03.2015
Сообщений: 80
10.05.2015, 10:22 7
Да, преподаватель сказал взять любой массив, где производятся какие-либо действия ( поиск max числа, поиск разницы между max и min и т.д), сделать функции шаблонными, и сделать наследование, реализовать его в int main(){} через INT и Double, вот так он нам сказал, но я не совсем понимаю, что такое шаблонные функции и наследование
0
2 / 2 / 0
Регистрация: 06.03.2015
Сообщений: 91
10.05.2015, 18:16 8
создать шаблонный класс и наследованный от этого класса метод (естественно шаблонный), реализовать его в int main(){} через INT и Double(на пример; найти max или min, найти разницу между max или min и т. д).
0
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
10.05.2015, 19:06 9
Без понятия, о каком наследовании и каких классах в данном случае может идти речь.
Вот шаблонная функция поиска наименьшего элемента в массиве:

C++
1
2
3
4
5
6
7
template <class T>
T min(T *arr, size_t size) {
   T minimal = arr[0];
   for (int i = 1; i < size; ++i)
      if (arr[i] < minimal) minimal = arr[i];
   return minimal;
}
Примерный вызов:
C++
1
2
3
4
5
6
7
int main ( ) {
   int arr_int[] = {1, 7, 3, 15, -2, 4};
   double arr_double[] = {1.2, 5.3, 7.451, 8.23, 5.11, 40.01};
 
   std::cout << min(arr_int, 6) << ' ' << min(arr_double, 6);
   return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от Fox123456 Посмотреть сообщение
наследованный от этого класса метод
Метод невозможно унаследовать от класса.
0
33 / 33 / 18
Регистрация: 15.05.2013
Сообщений: 236
10.05.2015, 20:00 10
Хех, это пять человек из одной группы просят реализовать или это один человек с кучей клонов?
0
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
10.05.2015, 22:47 11
FraidZZ,
C++
1
2
template <typename T, size_t size>
T min(const T(&arr)[size]) {
И далее можно при вызове размер не указывать
C++
1
std::cout << min(arr_int) << ' ' << min(arr_double);
0
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
10.05.2015, 23:02 12
MrGluck, да я знаю. Но работать это будет до первого указателя.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template <class T, size_t size>
T min(const T(&arr)[size]) {
   T minimal = arr[0];
   for (int i = 1; i < size; ++i)
      if (arr[i] < minimal) minimal = arr[i];
   return minimal;
}
 
int main ( ) {
    int arr[] = {1, 2, 3, 4};
    std::cout << min(arr) << std::endl;
    int *arr2 = new int[3];
    std::cout << min(arr2) << std::endl; // Упс!
    delete[] arr2;
}
0
Форумчанин
Эксперт CЭксперт С++
8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
11.05.2015, 00:39 13
FraidZZ, так мы о статических массивах говорили, а не об указателях.
0
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
11.05.2015, 00:50 14
MrGluck, я лично обобщил функцию для любого массива, будь то статический массив, или указатль на начало выделенной области памяти)

Можно два шаблона сделать, кстати, и радоваться жизни, вроде такого.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
template <class T, size_type size>
T min(const T(&arr)[size]){
   min(arr, size);
}
 
template <class T>
T min(const T* arr, size_t size) {
   T minimal = arr[0];
   for (int i = 1; i < size; ++i)
      if (arr[i] < minimal) minimal = arr[i];
   return minimal;
}
 
int main ( ) {
    int arr[] = {1, 2, 3, 4};
    std::cout << min(arr) << std::endl;
    int *arr2 = new int[3];
    std::cout << min(arr2, 3) << std::endl; // Уже не упс, хотя массив даже неиницализирован :D
    delete[] arr2;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.05.2015, 08:43 15
FraidZZ, у тебя в 10 строке ошибка.
0
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
11.05.2015, 10:23 16
Tulosba, в 10 строке у меня ошибки нет - у меня другая ошибка. Я как-то очень сильно вчера тупил и поставил шаблоны именно в таком порядке. В итоге первый min не видит второй и не может его вызвать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
template <class T>
T min(const T* arr, size_t size) {
   T minimal = arr[0];
   for (int i = 1; i < size; ++i)
      if (arr[i] < minimal) minimal = arr[i];
   return minimal;
}
 
template <class T, size_t size>
T min(const T(&arr)[size]){
   min(arr, size);
}
  
int main ( ) {
    int arr[] = {1, 2, 3, 4};
    std::cout << min(arr) << std::endl;
    int *arr2 = new int[3];
    std::cout << min(arr2, 3) << std::endl; // Уже не упс, хотя массив даже неиницализирован :D
    delete[] arr2;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.05.2015, 10:53 17
Цитата Сообщение от FraidZZ Посмотреть сообщение
в 10 строке у меня ошибки нет
Что будет, если size = 0?
0
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
11.05.2015, 11:01 18
Tulosba, ничего хорошего. А теперь встречный вопрос - что значит, если передан указатель на массив, в котором 0 элементов? Это значит, что сам указатель невалиден и отнюдь на T не указывает. И проверять это надо бы не в самой функции min.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.05.2015, 11:31 19
Цитата Сообщение от FraidZZ Посмотреть сообщение
что значит, если передан указатель на массив, в котором 0 элементов? Это значит, что сам указатель невалиден и отнюдь на T не указывает.
Отнюдь. Значит, что такой указатель нельзя разыменовывать, не более того.
C++
1
2
3
4
int* p = new int[0]; // см. ниже 5.3.4/7
cout << p << endl; // можно
cout << *p << endl; // нельзя (UB)
delete[] p; // можно и даже нужно
5.3.4/7: When the value of the expression in a noptr-new-declarator is zero, the allocation function is called to allocate an array with no elements.
Безопасное поведение и для сишного malloc с учетом указанного ранее ограничения:
If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.
Всё это к тому, что указатель на массив из 0 элементов - это нормально. До тех пор, пока ты не обращаешься к этим несуществующим элементам. Все стандартные (из си и плюсов) функции адекватно реагируют на нулевой размер.
1
Pure Free Digital Ghost
4598 / 1910 / 370
Регистрация: 06.01.2013
Сообщений: 4,564
11.05.2015, 11:49 20
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
2
3
4
int* p = new int[0]; // см. ниже 5.3.4/7 
cout << p << endl; // можно 
cout << *p << endl; // нельзя (UB) 
delete[] p; // можно и даже нужно
Это я знаю, спасибо

Речь о
Цитата Сообщение от Tulosba Посмотреть сообщение
отнюдь на T не указывает.
Цитата Сообщение от Tulosba Посмотреть сообщение
Все стандартные (из си и плюсов) функции адекватно реагируют на нулевой размер.
Что ж, учту. Тогда хай будет так:
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
29
30
31
32
33
#include <iostream>
#include <exception>
 
class not_valid_array : public std::exception {
public:
   virtual const char* what() const noexcept { return "Size of array shouldn't be zero"; }
};
 
template <class T>
T min(const T* arr, size_t size) {
   if (!size) throw not_valid_array();
   T minimal = arr[0];
   for (int i = 1; i < size; ++i)
      if (arr[i] < minimal) minimal = arr[i];
   return minimal;
}
 
template <class T, size_t size>
T min(const T(&arr)[size]){
   min(arr, size);
}
 
int main ( ) {
    int arr[] = {1, 2, 3, 4};
    try {
        std::cout << min(arr) << std::endl;
    } catch(std::exception& e) { std::cout << e.what(); }
    int *arr2 = new int[3];
    try {
        std::cout << min(arr2, 0) << std::endl; // Уже не упс, хотя массив даже неиницализирован :D
    } catch (std::exception& e) { std::cout << e.what(); }
    delete[] arr2;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2015, 11:49
Помогаю со студенческими работами здесь

Шаблонный метод шаблонного класса
template &lt;class T1&gt; class A{ public: A(){}; void f(); }; template &lt;class T1,class T2&gt;...

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

Шаблонный класс от шаблонного класса, ругается компоновщик
абстрактный класс Хэширования template &lt;class typeHashData, class typeHashIndex&gt; class...

Шаблонный класс. Создание экземпляра класса с динамическим выделением памяти
Вопрос Как задать экземпляра шаблонного класса с динамическим выделением памяти.Можно с примером)


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru