-
Notifications
You must be signed in to change notification settings - Fork 2
/
templates3.cpp
60 lines (51 loc) · 2.19 KB
/
templates3.cpp
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
/*
Шаблонные классы можно наследовать. Реализуйте шаблонную структуру ValueHolder с одним типовым параметром T, унаследованную от интерфейса ICloneable. Интерфейс ICloneable содержит всего один виртуальный метод ICloneable* clone() const, который должен вернуть указатель на копию объекта, на котором он был вызван (объект должен быть создан в куче). Шаблон ValueHolder, как говорит его название, хранит всего одно значение (назовите его data_) типа T (для типа T определен конструктор копирования). Не делайте поле data_ закрытым (поэтому в данном случае мы явно пишем, что ValueHolder должна быть структурой).
Sample Input:
There are no tests for this task
Sample Output:
OK
*/
#include <iostream>
using namespace std;
/*
* Шаблонные классы можно наследовать.
* Реализуйте шаблонную структуру ValueHolder с одним типовым параметром T,
* унаследованную от интерфейса ICloneable.
* Интерфейс ICloneable содержит всего один виртуальный метод ICloneable* clone() const,
* который должен вернуть указатель на копию объекта, на котором он был вызван (объект должен быть создан в куче).
* Шаблон ValueHolder, как говорит его название,
* хранит всего одно значение (назовите его data_) типа T (для типа T определен конструктор копирования).
* Не делайте поле data_ закрытым (поэтому в данном случае мы явно пишем, что ValueHolder должна быть структурой).
* */
struct ICloneable
{
virtual ICloneable* clone() const = 0;
virtual ~ICloneable() { }
};
// Шаблон ValueHolder с типовым параметром T,
// должен содержать одно открытое поле data_
// типа T.
//
// В шаблоне ValueHolder должен быть определен
// конструктор от одного параметра типа T,
// который инициализирует поле data_.
//
// Шаблон ValueHolder должен реализовывать
// интерфейс ICloneable, и возвращать указатель
// на копию объекта, созданную в куче, из метода
// clone.
template <typename T>
struct ValueHolder : ICloneable {
ValueHolder(T value) : data_(value) {};
ValueHolder * clone() const {
return new ValueHolder(*this);
}
~ValueHolder() {}
T data_;
};
int main() {
ValueHolder<int> *v0 = new ValueHolder<int>(1);
ValueHolder<int> *v1 = v0->clone();
cout << v0->data_ << " " << v1->data_<< " " << endl;
return 0;
}