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

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сложная задачка http://www.cyberforum.ru/cpp-beginners/thread405680.html
Сформировать на экране изображение показанное на рисунке. Построить программу таким образом, чтобы щелчек мыши на ключевом слове соответствующего оператора приводил к выводу в информационное окно структуры оператора и его содержания. Примерный рисунок: ___________________________________________________________________________________________ if goto ...
C++ перевод кода из Pascal в C++ помогите, пожалуйста, перевести этот код в C++ :impossible: program chisla; uses Crt; const n = 5; var y: real; flag: boolean; i,j,x: integer; procedure Analysis; http://www.cyberforum.ru/cpp-beginners/thread405669.html
Inline функции C++
Друзья!Инлайн функции могу быть определены только внтури класса?Или могут быть определены вне класса?Если вне,то как?Спасибо!
Вывести символ на экран, если он является печатаемым и видимым C++
Вывести символ на экран, если он является печатаемым и видимым
C++ Найти количество элементов в массиве, имеющих значение выше заданного http://www.cyberforum.ru/cpp-beginners/thread405657.html
Найти количество элементов в массиве, имеющих значение выше заданного
C++ Проверить на ошибки класс "Двусвязный список" Вот задание 1. Реализовать (на основе лекционного материала) класс String, который представляет строку символов произвольной длины (отчет - реализация класса). 2. Разработать класс двусвязный список (DoubleList), содержащей строки String. Класс должен иметь интерфейс АТД который включает методы для добавления, удаления, поиска элементов в соответствии с логикой работы структуры данных, а также... подробнее

Показать сообщение отдельно
endemic
1 / 1 / 0
Регистрация: 12.12.2011
Сообщений: 9

Возможно ли создание объекта шаблонного класса в функции этого класса? - C++

12.12.2011, 21:55. Просмотров 959. Ответов 2
Метки (Все метки)

Доброго времени суток, уважаемые форумчане

Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями доступа по индексу [], получения длины () и разности множеств "-". Вот с последним и проблемка. Опыта у меня маловато, поэтому не могу понять, то ли лыжи не едут, то ли я дурак Меня интересует можно ли как-то реализовать перегрузку минуса, чтобы он возвращал ссылку на объект (или объект).

Код класса:
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <iostream>
 
using namespace std;
 
template <class T> 
class Set
{
    int size;
    T* data;
public:
    Set();                  //Конструктор пустого множества
    Set(int n,T a);         //Конструктор с параметром
    Set(const Set<T>& s);   //Копирования
    ~Set();                 //Деструктор
 
    Set<T>& operator =(const Set<T>& a);    //Присваивания
    T& operator [](int index);                  //Доступ по индексу
    int operator ()();                      //Возврат длины
    Set<T> operator -(const Set<T>& a);     //Разность множеств (Не реализовано)
 
    void GetD(const Set<T>& a,const Set<T>& b); //Замена предыдущего
 
    void Add(T a);  //Добавляет элемент
 
    friend ostream& operator << <>(ostream& out, const Set<T>& a);
    friend istream& operator >> <>(istream& in, Set<T>& a);
};
 
 
template <class T>
Set<T>::Set()
{
    size=0;
    data=0;
}
 
template <class T>
Set<T>::Set(int n,T a)
{
    size=n;
    data=new T[size];
    for(int i=0;i<size;i++)
        data[i]=a;
}
 
template <class T>
Set<T>::Set(const Set<T>& a)
{
    size=a.size;
    data=new T[size];
    for(int i=0;i<size;i++)
        data[i]=a.data[i];
}
 
template <class T>
Set<T>::~Set()
{
    delete[] data;
    data=0;
}
 
template <class T>
Set<T>& Set<T>::operator=(const Set<T>& a)  //Оператор присваивания
{
    if(this==&a) return *this;
    size=a.size;
    if(data!=0) delete[] data;
    data=new T[size];
    for(int i=0;i<size;i++)
        data[i]=a.data[i];
    return *this;
}
 
template <class T>  
T& Set<T>::operator[](int index) //операция доступа по индексу 
{ 
    if (index<size) return data[index]; 
    else  cout<<"\nError! Index>size"; 
}
 
template <class T>  
int Set<T>::operator ()() //операция для получения длины вектора 
{ 
    return size; 
} 
 
template <class T>  
void Set<T>::Add(T a)
{
    T* newdata=new T[size+1];
    for(int i=0;i<size;i++)
        newdata[i]=data[i];
    newdata[size]=a;
    size=size+1;
    delete[] data;
    data=newdata;
}
 
 
template<class T>
Set<T> Set<T>::operator -(const Set<T>& a)
{
    Set<T> temp();                    //Вот здесь компилятор не может "опознать" класс
    for(int i=0;i<size;i++)
        for(int j=0;j<a.size;j++)
        {
            if(data[i]!=a.data[j])
                temp.Add(data[i]);       //И здесь требует, чтобы выражение слева от точки было классом
        }
    return temp;
}
*/
 
/* В связи с невозможностью выполнения предыдущей задачи
произведена замена оператора на функцию.
*/
 
template <class T>  
void Set<T>::GetD(const Set<T> &a, const Set<T> &b)
{
    T* dummy;       //Указатель на объект класса
    dummy=0;
    if(data!=0) return; //Кидать только в пустой
    for(int i=0;i<a.size;i++)       //Проверим все элементы множества А
        for(int j=0;j<b.size;j++)   //На наличие таких же в множестве В
        {
            if(a.data[i]!=b.data[j]&&dummy!=a.data+i*sizeof(T)) //И выберем только те, которых нет в В
            {
                this->Add(a.data[i]);       //Добавим их в множество С(результат)
                dummy=a.data+i*sizeof(T);   //И пометим адрес, чтобы не создавать дубликатов
            }
        }
}
 
template <class T>  
ostream& operator <<(ostream& out,const Set<T>& a) //Вывод
{
    if(a.data==0)
    {
        out<<"Empty Set"<<endl;
        return out;
    }
    for(int i=0;i<a.size;i++) 
        out<<a.data[i]<<" "; 
    return out; 
} 
 
template <class T>  
istream& operator >>(istream& in,Set <T>& a) 
{ 
    int n;
    T t;
    cout<<"N-? ";cin>>n;
    for(int i=0;i<n;++i) 
    {
        in>>t;
        a.Add(t);
    }   
    return in; 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru