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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
endemic
1 / 1 / 0
Регистрация: 12.12.2011
Сообщений: 9
#1

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

12.12.2011, 21:55. Просмотров 970. Ответов 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; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2011, 21:55     Возможно ли создание объекта шаблонного класса в функции этого класса?
Посмотрите здесь:

Создание Шаблонного класса - C++
Здравствуйте! Столкнулся с проблемой создания шаблона для класса. Не могу понять как ввести более одного символа если объявляю шаблон для...

Создание шаблонного класса(очередь) - C++
Создал приоритетную очередь: #include &lt;iostream&gt; template&lt;typename T&gt; class Element { public: Element(double key,...

возвращаемые значения функции шаблонного класса A и A<T> - C++
первый листинг template &lt;typename T&gt; class A { public: T a; A&amp; f()

Описание функции шаблонного класса библиотеки в отдельном cpp-файле - C++
Есть библиотека. В файле ARRAYLIST.HPP описан шаблон template &lt;typename _Type&gt; class ArrayList { private: int length; ...

Возможно ли явное разрушение объекта класса? - C++
Код (класс матрицы) #include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; class MATRIX_us{ private://V int...

Создание объекта класса - C++
Здравствуйте, подскажите пожалуйста в чем разница между Test t(блаблабла); и Test *t = new Test(блаблабла); Я так понимаю что...

Создание объекта класса - C++
Создал свой класс с именем и фамилией, не могу создать объект этого класса, при проверке на ошибки всё нормально. Person.h #pragma once...

Возможно ли создать шаблонный объект шаблонного объекта? - C++
Всем хай, помогите ) Возможно ли создать : List&lt;TreeNode&lt;NODETYPE&gt;*&gt; hop; (есть шаблонный список , и я пытаюсь создать список из...

Создание объекта по имени класса - C++
Привет, собственно вопроса три: 1) Как называется тип класса (то что в шарпе наззывается Type, и откуда его инклюдить) 2) Как зная...

Создание объекта класса из потока - C++
Всем привет. Пишу простенькую игрушку, понадобилось для нее подобие движка(сразу оговорюсь: для рендеринга используется OpenGL, игра...

Динамическое создание объекта класса - C++
Примерно что должно получится: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class student { string name; ...

Создание объекта класса в switch - C++
switch (c) {case 1: man a; break; Как создать объект класса в switch? switch не хочет и выдает ошибку. Или как это заменить?


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.12.2011, 22:02     Возможно ли создание объекта шаблонного класса в функции этого класса? #2
Цитата Сообщение от endemic Посмотреть сообщение
C++
1
Set<T> temp(); //Вот здесь компилятор не может "опознать" класс
компилятор думает что это функция,убери круглые скобки
endemic
1 / 1 / 0
Регистрация: 12.12.2011
Сообщений: 9
12.12.2011, 22:12  [ТС]     Возможно ли создание объекта шаблонного класса в функции этого класса? #3
Убрал - работает. Значит пора спать.

Спасибо за помощь.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru