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

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

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

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

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

создание объекта класса в методе этого же класса - C++
собственно вопрос. можно ли создавать объект класса в методе того же класса? насколько это правильно и как это можно сделать (если это...

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Построение описания класса, создание и уничтожение объектов этого класса - C++
Построить описание класса, содержащего информацию о почтовом адресе организации. Предусмотреть возможность раздельного изменения...

Создание объекта класса с полем являющимся объектом другого класса - C++
Bill a; cin&gt;&gt;a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у Spiska(Bill A,int,string,int) ...

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

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

Спасибо за помощь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2011, 22:12
Привет! Вот еще темы с ответами:

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

Объявление класса, создание объекта и вызов функции-члена - C++
Всем добрый день! Вот так я объявляю класс. typedef map&lt;string, double&gt; datablock; typedef map&lt;string, string&gt; groupvars; ...

Чем отличается шаблонный метод класса от шаблонного класса? - C++
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок на летературу

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++
Друзья! Почему так? #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ ...


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

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

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