10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
1

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

13.04.2013, 02:34. Показов 2323. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2013, 02:34
Ответы с готовыми решениями:

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список)....

Исправить ошибку компиляции "для использования класса шаблон требуется список аргументов шаблона"
Решил создать класс List для задания двусвязного списка, и в самом начале компилятор начал ругаться...

"LinkedList": для использования класс шаблон требуется список аргументов шаблон
Что то не могу въехать в чем промах? LinkedList.h #pragma once #include &lt;iostream&gt; #include...

Однонаправленный список типа "Очередь". Поменять элементы местами
Всем привет. Есть такая вот задачка: Поменять местами наибольший среди отрицательных и...

6
299 / 293 / 88
Регистрация: 03.02.2013
Сообщений: 846
13.04.2013, 02:49 2
тут понимаете какая история...

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

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

вариант нормальный - перенесите эти методы сюда (в сею функцию) но вместо cin пишите is, типа is>>i, а вместо cout согласно вашей сигнатуре в опреторе<< -
os<<
1
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 02:57  [ТС] 3
Я просто затормозил на том, что в вводе и выводе надо работать с разными полями разных объектов. И я не понимаю как сделать это обращение.
0
299 / 293 / 88
Регистрация: 03.02.2013
Сообщений: 846
13.04.2013, 03:17 4
Я просто затормозил на том, что в вводе и выводе надо работать с разными полями разных объектов. И я не понимаю как сделать это обращение.
кароче давайте я вам набросал как должен выглядить для компилятора
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
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 18:05  [ТС] 5
Так это разве не тоже самое, что у меня, только в профиль? Блин. Совсем запутался.
Вот смотрите, у меня есть два объекта 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
299 / 293 / 88
Регистрация: 03.02.2013
Сообщений: 846
13.04.2013, 20:59 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
#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
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 22:10  [ТС] 7
Сейчас буду разбираться, но вроде бы это то что надо. Спасибо Вам большое =D
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2013, 22:10
Помогаю со студенческими работами здесь

Реализовать шаблонный класс "Несортированный однонаправленный список"
Здравствуйте! Не могу реализовать работу по шаблонам : Несортированный однонаправленный список:...

АТД "Однонаправленный список" с элементами типа char
помогите пожалуйста) АТД − однонаправленный список с элементами типа char. Дополнительно...

Сформировать однонаправленный кольцевой список и провести удвоение буквы "Т" в нем
Сформировать однонаправленный кольцевой список и провести удвоение буквы &quot;Т&quot; в нем (код выдает...

Сформировать однонаправленный кольцевой список и провести удвоение буквы "Т" в нем
Задание: Сформировать однонаправленный кольцевой список и провести удвоение буквы &quot;Т&quot; в нем - C++...


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

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

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