Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349

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

02.04.2017, 15:45. Показов 916. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Есть задание:
1. Создать шаблон заданного класса. Определить перегруженную операцию присваивания (“=”) и операции, заданные в варианте задания.
2. Написать программу тестирования, в которой проверяется использование шаблона для стандартных типов данных.
3. Выполнить тестирование.
4. Определить пользовательский класс, который будет использоваться в качестве параметра шаблона. Определить в классе необходимые функции и перегруженные операции.
5. Написать программу тестирования, в которой проверяется использование шаблона для пользовательского типа.
6. Выполнить тестирование.

Как делал я:
Класс
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
 
template <typename T>
class Set
{
  T *mas;
 
public:
 
    Set(int a)
    {
      mas=new int[a];
      for(int i=0;i<a;i++)
      {
        mas[i]=0;
      }
    }
 
    T set(int a)
    {
      std::cout<<"Введите массив:\n";
      for(int i;i<a;i++)
      {
        std::cin>>mas[i];
      }
    }
 
    Set operator* (Set& ob)
    {
      Set t;       // здесь выдаёт ошибку
      int k=0;
 
      for(int i=0;i<150;i++)
      {
          for(int j=0;j<150;j++)
          {
            if(mas[i]==ob.mas[j])
            {
              t.mas[k++]=mas[i];
              break;
            }
          }
      }
      if(k!=0){
        std::cout<<"\nсовпадение обнаружено:"<<t.mas;
      }else {std::cout<<"\nсовпадений не обнаружено...\n";}
        return t;
    }
 
};
Главная функция:
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
#include "stdafx.h"
#include <iostream>
#include <clocale>
#include "class.h"
 
using namespace std;
 
int main()
{
    setlocale(0,"");
 
    int q=0;
    cout<<"Введите размерность массива:";
    cin>>q;
 
    Set<int> obj(q);
    obj.set(q);
    Set<int> obj1(q);
    obj1.set(q);
 
    obj*obj1;
 
    system("pause");
    return 0;
}
В общем и целом, эту тему мы только начали и ошибок я могу наделать много. Вот и пришёл сюда за советом...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2017, 15:45
Ответы с готовыми решениями:

Шаблон родительского класса и шаблон класса потомка
Запутался, как правильно пронаследоваться от шаблона класса? #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; ...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

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

14
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.04.2017, 15:48
Цитата Сообщение от Tankist 90 Посмотреть сообщение
// здесь выдаёт ошибку
конструктора по-умолчанию нет.
есть только тот, который принимает число.
Цитата Сообщение от Tankist 90 Посмотреть сообщение
for(int i=0;i<150;i++)
* * * {
* * * * * for(int j=0;j<150;j++)
* * * * * {
* * * * * * if(mas[i]==ob.mas[j])
если в mas выделено меньше памяти, чем под 150 элементов, то будет выход за границы выделенной памяти.
1
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349
02.04.2017, 16:25  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
150 элементов
Точно, мой недосмотр. Сначала хотел со статическим писать, а после поменять забыл. Вот только:
Цитата Сообщение от Tankist 90 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
for(int i=0;i<150;i++)
* * * {
* * * * * for(int j=0;j<150;j++)
* * * * * {
* * * * * * if(mas[i]==ob.mas[j])
* * * * * * {
* * * * * * * t.mas[k++]=mas[i];
* * * * * * * break;
* * * * * * }
* * * * * }
* * * }
Как в цикл передать значение "а". Как обычный параметр функции?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.04.2017, 16:28
Цитата Сообщение от Tankist 90 Посмотреть сообщение
Как в цикл передать значение "а". Как обычный параметр функции?
лучше хранить размер в самом классе.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.04.2017, 16:29
Цитата Сообщение от Tankist 90 Посмотреть сообщение
Как в цикл передать значение "а". Как обычный параметр функции?
У вас конструктор принимает размер массива в качестве параметра. Создайте новую переменную внутри класса и инициализируйте её значением из конструктора.
1
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349
02.04.2017, 16:43  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Создайте новую переменную внутри класса
Спасибо, исправил. Теперь выдаёт необработанное исключение в этой части кода:
Цитата Сообщение от Tankist 90 Посмотреть сообщение
C++
1
t.mas[k++]=mas[i];
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.04.2017, 17:06
Цитата Сообщение от Tankist 90 Посмотреть сообщение
Теперь выдаёт необработанное исключение в этой части кода:
Покажите весь исправленный код.
0
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349
02.04.2017, 17:09  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Покажите весь исправленный код.
Вот:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
 
template <typename T>
class Set
{
 
  int g;
  T *mas;
 
public:
 
    Set(){}
    Set(int a)
    {
      g=a;
      mas=new int[a];
      for(int i=0;i<a;i++)
      {
        mas[i]=0;
      }
    }
 
    Set(Set&ob){}
    
 
    void set(int a)
    {
      std::cout<<"Введите массив:\n";
      for(int i=0;i<a;i++)
      {
        std::cin>>mas[i];
      }
    }
 
    Set operator* (Set& ob)
    {
      Set t;
      int k=0;
 
      for(int i=0;i<g;i++)
      {
          for(int j=0;j<g;j++)
          {
            if(mas[i]==ob.mas[j])
            {
              t.mas[k++]=mas[i];
              break;
            }
          }
      }
      if(k!=0){
        std::cout<<"\nсовпадение обнаружено:"<<t.mas;
      }else {std::cout<<"\nсовпадений не обнаружено...\n";}
        return t;
    }
 
};
Главную не изменял...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.04.2017, 17:15
Tankist 90, у вас значение k превышает размер массива (g).
0
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349
02.04.2017, 17:27  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
k превышает размер массива
Не понимаю...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.04.2017, 17:38
Цитата Сообщение от Tankist 90 Посмотреть сообщение
Не понимаю...
Поясняю. 46-я строка. В массиве mas ровно g элементов. Вы не можете писать и читать за пределами этого ([0;g]) диапазона.
У вас, значение k, выходит за эти пределы.
0
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349
02.04.2017, 17:54  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Поясняю
Предложите исправление, ведь k инкременируется "тогда и только тогда, когда..." Ошибка в логике?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.04.2017, 18:12
Цитата Сообщение от Tankist 90 Посмотреть сообщение
Предложите исправление
Как я могу исправить вашу программу, если вы не описали принцип её действия!? Другими словами - я понятия не имею что делает ваша программа.

Цитата Сообщение от Tankist 90 Посмотреть сообщение
Ошибка в логике?
Да.
0
 Аватар для Tankist 90
0 / 0 / 2
Регистрация: 27.04.2015
Сообщений: 349
02.04.2017, 19:56  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Да
Увидел:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Set operator* (Set& ob)
    {
      Set t(g); // нужен был параметр
      int k=0;
 
      for(int i=0;i<g;i++)
      {
          for(int j=0;j<g;j++)
          {
            if(mas[i]==ob.mas[j])
            {
              t.mas[k++]=mas[i];
              break;
            }
          }
      }
      if(k!=0){
              std::cout<<"\nсовпадение обнаружено:"<<t.mas<<endl;
      }else {std::cout<<"\nсовпадений не обнаружено...\n"<<endl;}
        return t;
    }
Теперь проблема в том, что при обнаружении совпадения выводит мусор...
0
5 / 5 / 6
Регистрация: 02.02.2014
Сообщений: 31
02.04.2017, 22:05
При обнаружении надо вывести весь массив?

Добавлено через 6 минут
Если я правильно понял логику
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 Set operator* (Set& ob)
    {
      Set t;
      int k=0;
 
      for(int i=0;i<g;i++)
      {
          for(int j=0;j<g;j++)
          {
            if(mas[i]==ob.mas[j])
            {
              t.mas[k++]=mas[i];
              std::cout<<"\nсовпадение обнаружено:"<<t.mas[k];
              break;
            }
          }
      }
      if(k=0)
          std::cout<<"\nсовпадений не обнаружено...\n";
        return t;
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2017, 22:05
Помогаю со студенческими работами здесь

Написать шаблон класса на основе класса vector для реализации стековой структуры данных
Пыталась написать код, но не уверена будет ли такая реализация корректной, можно ли это сделать как-то по - другому? И как надо...

Шаблон класса (параметризация класса)
Нужна помощь и советы!!! Англо-русский словарь построен как список. Каждая компонента содержит английское слово, соответствующее...

Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса
Добрый день, Уважаемые профессионалы. Прошу помочь в решении задачи. Честно говоря, я ничего не понимаю. И вот...решил...

Шаблон класса с++
StakNode.h #ifndef _STACKNODE_H_ #define _STACKNODE_H_ #include &lt;string&gt; template&lt;class T&gt; class Stack { ...

Шаблон класса c++
#include&lt;iostream&gt; template &lt;class type, type defau&gt; class A { public: A() { std::cout &lt;&lt; &quot;!!!&quot;; }; }; class C { ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru