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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 02:34     Шаблон класса "Однонаправленный список" #1
Доброго времени суток. Возник вопрос по шаблонам. С самими шаблонами я вроде бы разорался, и вот хотелось бы сделать такую вещь. Чтобы я мог создавать список тех объектов, которые захочу. Но не могу додуматься как сделать ввод и вывод. попытался создать функции в классах, объекты которых мы хотим создать и как-то к ним обратится. Да вот не получается. Помогите, пожалуйста, либо сделать, чтобы мой вариант работал, либо как-то по-другому реализовать. Заранее спасибо.
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;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
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<<
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 02:57  [ТС]     Шаблон класса "Однонаправленный список" #3
Я просто затормозил на том, что в вводе и выводе надо работать с разными полями разных объектов. И я не понимаю как сделать это обращение.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
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){
в таком ключе тоже будет понятно как сделать
art3330
 Аватар для art3330
9 / 9 / 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;
};
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
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-функциях?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2013, 22:10     Шаблон класса "Однонаправленный список"
Еще ссылки по теме:

C++ Шаблон класса "Стек" на основе массива
Шаблон класса "Животное" (Мультимножество) C++
Шаблон класса "Бинарное дерево" с насследованием C++

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

Или воспользуйтесь поиском по форуму:
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
13.04.2013, 22:10  [ТС]     Шаблон класса "Однонаправленный список" #7
Сейчас буду разбираться, но вроде бы это то что надо. Спасибо Вам большое =D
Yandex
Объявления
13.04.2013, 22:10     Шаблон класса "Однонаправленный список"
Ответ Создать тему
Опции темы

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