Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141

Шаблон класса "Однонаправленный список"

13.04.2013, 02:34. Показов 2624. Ответов 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
 
using namespace std;
 
class Data{
    private:
        int day;
        int mon;
        int year;
    public:
        Data():day(0),mon(0),year(0) {};
        Data(int d, int m, int y):day(d),mon(m),year(y) {};
        
        void instruct(){
            cout<<"Enter time: "<<endl;
            cin>>day>>mon>>year;
        };
        
        void outstruct(){
            cout<<"Data: "<<day<<mon<<year;
        };
};
 
 
class Time{
    private:
        double sec;
        double min;
        double hour;
    public:
        Time():sec(0),min(0),hour(0) {};
        Time(int s, int m, int h):sec(s),min(m),hour(h) {};
        
        void instract(){
            cout<<"Enter time: "<<endl;
            cin>>sec>>min>>hour;
        };
        
        void outstract(){
            cout<<"Time: "<<sec<<min<<hour;
        };
};
        
 
template<class T>class Node{
    public:
        Node *next;
        T *data;
        Node():next(0){};
};
 
template<class T>class List{
    private:
        Node<T>* first;
        Node<T>* current;
        
    public:
        List():first(0),current(0) {};
        ~List(){
            while (first!=0){
                current=first;
                first=current->next;
                delete current;
            };
        };
        
    private:
    
    void in(){
        int i=1;
        while (i!=0){
            if (first==0){
                current=new Node<T>();
                current->data=new T();
                first=current;
            }
            else{       
                current->next=new Node<T>();
                current=current->next;
                current->data=new T();
            };
            cout<<"Enter time"<<endl;
            cout<<"Seconds: ";
            T::instruct();
            cout<<"Enter 0 to continue: ";
            cin>>i;
        };
    };
        
    void out(){
        current=first;
        while(current!=0){
            cout<<"Data: "<<endl;
            T::outstruct();
            current=current->next;
        };
    };
    
    friend istream& operator >> (istream& is, List& obj){
        obj.in();
        return is;
    };
    
    friend ostream& operator << (ostream& os, List& obj){
        obj.out();
        return os;
    };
};
 
int main(){
    List<Time> obj1;
    cin>>obj1;
    cout<<obj1;
    List<Data> obj2;
    cin>>obj2;
    cout<<obj2;
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2013, 02:34
Ответы с готовыми решениями:

Разработать шаблон класса "Однонаправленный список"
Разработать шаблон класса для работы с однонаправленным некольцевым списком. Реализовать следующие действия: добавление звена в начало...

Однонаправленный линейный список. Шаблон. Функции
Подскажите по коду: #include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;iomanip&gt; #include &lt;string&gt; using namespace std; ...

Вставка элемента в однонаправленный список.Изначально в программе создаётся однонаправленный список. После его заполнени
#include &lt;iostream&gt; #include &lt;iostream&gt; #include&lt;cstring&gt; #include&lt;Windows.h&gt; using namespace std; struct list{ int...

6
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,858
13.04.2013, 02:49
тут понимаете какая история...

вот эта штука
C++
1
friend istream& operator >> (istream& is, List& obj)
нужна чтобы перегрузить оператор >> для вашего класса если он встречается на объектах istream типа консоль или файл...
дальше вы зачем-то берёте метод объекта... а в методе жёстко завязываете на конкретный поток cout, аналогично и с cin

так делать нельзя
вариант дешёвый - уберите их вообще и пользуйтесь в main(), сделайте in() и out() public и пользуйтесь ими

вариант нормальный - перенесите эти методы сюда (в сею функцию) но вместо cin пишите is, типа is>>i, а вместо cout согласно вашей сигнатуре в опреторе<< -
os<<
1
 Аватар для art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 02:57  [ТС]
Я просто затормозил на том, что в вводе и выводе надо работать с разными полями разных объектов. И я не понимаю как сделать это обращение.
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,858
13.04.2013, 03:17
Я просто затормозил на том, что в вводе и выводе надо работать с разными полями разных объектов. И я не понимаю как сделать это обращение.
кароче давайте я вам набросал как должен выглядить для компилятора
C++
1
friend istream& operator >> (istream& is, List& obj)
но допустимы логические ошибки (я не разбирал вашего алгоритма)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
friend istream& operator >> (istream& is, List& obj){
       // obj.in();
        int i=1;
        while (i!=0){
            if (obj.first==0){
                obj.current=new Node<T>();
                obj.current->data=new T();
                obj.first=obj.current;
            }
            else{       
                obj.current->next=new Node<T>();
                obj.current=obj.current->next;
                obj.current->data=new T();
            };
        is>>i;
        };
        return is;
    };
и отметьте, что в нём нельзя пользоваться cout, это будет моветон

делайте типа так:
C++
1
2
3
4
5
6
7
void main()
{
....
cout<<"введите что-то ";
cin>>myobj;
...
}
думаю с
C++
1
friend ostream& operator << (ostream& os, List& obj){
в таком ключе тоже будет понятно как сделать
1
 Аватар для art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 18:05  [ТС]
Так это разве не тоже самое, что у меня, только в профиль? Блин. Совсем запутался.
Вот смотрите, у меня есть два объекта Time и Date. У них разные поля, которые надо ввести/вывести. (sec/day и т.д.). Так я не могу разобраться как сделать, чтобы мой шаблон сам решал какие поля выводить. Передали класс Time - выводит время, класс Date - дату. Поэтому я и запихнул ввод/вывод в сами классы и пытаюсь их вызвать через шаблон.

Добавлено через 18 минут
Вот чтобы я так мог сделать.
C++
1
2
3
4
5
6
7
8
int main(){
    List<Time> obj1;
    cin>>obj1;
    cout<<obj1;
    List<Data> obj2;
    cin>>obj2;
    cout<<obj2;
};
Добавлено через 4 часа 29 минут
Совсем запутался.

Добавлено через 1 час 21 минуту
Я просто через шаблон хочу вызвать одноименные методы из разных классов. Так можно?

Добавлено через 1 час 24 минуты
Видимо нельзя. Потому что не нашел я ничего толкового в интернете.
А вот такой момент. У менять есть такое задание: "Создать шаблон класса «Однонаправленный список». Реализовать списки объектов класса «Дата»." Я немного не понимаю, чего конкретно от меня хотят. Если заточить шаблон под один класс "Дата", то какой тогда смысл в этом шаблоне?

Добавлено через 9 минут
Если по заданию, то просто надо делать так ?
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
 
using namespace std;
 
class Date{
    public:
        int day;
        int mon;
        int year;
 
        Date():day(0),mon(0),year(0) {};
        Date(int d, int m, int y):day(d),mon(m),year(y) {};     
};      
 
template<class T>class Node{
    public:
        Node *next;
        T *data;
        Node():next(0){};
};
 
template<class T>class List{
    private:
        Node<T>* first;
        Node<T>* current;
        
    public:
        List():first(0),current(0) {};
        ~List(){
            while (first!=0){
                current=first;
                first=current->next;
                delete current;
            };
        };
        
    private:
    
    void in(){
        int i=1;
        while (i!=0){
            if (first==0){
                current=new Node<T>();
                current->data=new T();
                first=current;
            }
            else{       
                current->next=new Node<T>();
                current=current->next;
                current->data=new T();
            };
            cout<<"Enter date"<<endl;
            cout<<"Day: ";
            cin>>current->data->day;
            cout<<"Month: ";
            cin>>current->data->mon;
            cout<<"Year: ";
            cin>>current->data->year;
            cout<<"Enter 0 to exit: ";
            cin>>i;
        };
    };
        
    void out(){
        current=first;
        while(current!=0){
            cout<<"\nData: "<<endl;
            cout<<current->data->day<<"."
            <<current->data->mon<<"."
            <<current->data->year;
            current=current->next;
        };
    };
    
    friend istream& operator >> (istream& is, List& obj){
        obj.in();
        return is;
    };
    
    friend ostream& operator << (ostream& os, List& obj){
        obj.out();
        return os;
    };
};
 
int main(){
    List<Date> obj1;
    cin>>obj1;
    cout<<obj1;
};
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,858
13.04.2013, 20:59
Я просто через шаблон хочу вызвать одноименные методы из разных классов. Так можно?
Видимо нельзя. Потому что не нашел я ничего толкового в интернете.
почему нельзя? можно, есть миллион и один способ, просто я не совсем тебя понимаю...

вот набросал, может тебе что-то в этом духе надо???:

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
#include <iostream>
 
using namespace std;
 
class A
{
  public : int var;
  void output(ostream &stream) const
      { stream << "Class A object - " << this->var;}; 
};
 
class B
{
  public : char var;
  void output (ostream &stream) const { stream <<"Class B object -  "<< this->var;}; 
};
 
template <class T>
class C
{
   public :
   T myobj;
   T setvar(T a) {myobj.var = a.var;};
   T add (T& a, T& b) {return a.var+b.var;}
};
 
template <typename T>
std::ostream & operator<<(std::ostream & os, const C<T> & myobj) 
{
   myobj.myobj.output(os);
   return os;
}
 
int main()
{
    
    A z;
    z.var = 10;
    B x;
    x.var = 'X';
    
    C<A> a;
    C<B> b;
    
    a.setvar(z);
    b.setvar(x);
    
    cout<<a<<endl;
    cout<<b<<endl;
    
 
    system("pause");
    return 0;
};
собтна это я бросал думая чтобы как ты заказывал конструкцию работала:
C++
1
2
3
4
5
6
7
8
    C<A> a;
    C<B> b;
    
    a.setvar(z);
    b.setvar(x);
    
    cout<<a<<endl;
    cout<<b<<endl;
или я вообще не понимаю что ты хочешь )))

Добавлено через 8 минут
может речь идёт о virtual-функциях?
0
 Аватар для art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 22:10  [ТС]
Сейчас буду разбираться, но вроде бы это то что надо. Спасибо Вам большое =D
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2013, 22:10
Помогаю со студенческими работами здесь

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

Создать класса «однонаправленный кольцевой список».
Подскажите пожалуйста, в чем ошибка, так как компилятор ошибку не выдает, одна при запуске вылетает, при отладке вылетает на этой строке...

Функции для класса List (однонаправленный линейный список)
Есть красивый и аккуратный код: #include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;iomanip&gt; #include &lt;string&gt; using namespace...

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

Шаблон класса двусвязный список
Для решения задачи описать и использовать шаблон класса &quot;двусвязный список&quot;. Необходимо составить программу которая содержит...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru