-
Notifications
You must be signed in to change notification settings - Fork 2
/
PrivateClassObjects.cpp
59 lines (51 loc) · 1.92 KB
/
PrivateClassObjects.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
/*
Определен следующий класс (он также приведен в комментарии в шаблоне кода):
struct Cls {
Cls(char c, double d, int i);
private:
char c;
double d;
int i;
};
Как видно, все поля этого класса закрытые, ваша задача реализовать несколько функций, которые дают полный доступ к этим полям (см. шаблон кода), не смотря на то, что они закрытые.
Внимание: предполагаемое решение этого задания существенно опирается на Undefined Behaviour и является исключительно учебным, но полезно для лучшего понимания того, как работают модификаторы доступа. Решение было проверено на различных компиляторах (g++/clang++/icc/msvc), но мы настоятельно не рекомендуем использовать подобные трюки в боевом коде.
Требования к реализации: при решении этого задания вам разрешается заводить любые вспомогательные функции и классы, но не изменять определение класса Cls. Не нужно вводить или выводить что-либо, также не нужно определять функцию main.
*/
/*
* Класс Cls определен точно таким образом:
*
* struct Cls {
* Cls(char c, double d, int i);
* private:
* char c;
* double d;
* int i;
* };
*
*/
// Эта функция должна предоставить доступ к полю c объекта cls.
// Обратите внимание, что возвращается ссылка на char, т. е.
// доступ предоставляется на чтение и запись.
char &get_c(Cls &cls) {
char* ptr;
ptr = (char*)&cls;
return *ptr;
}
// Эта функция должна предоставить доступ к полю d объекта cls.
// Обратите внимание, что возвращается ссылка на double, т. е.
// доступ предоставляется на чтение и запись.
double &get_d(Cls &cls) {
double* ptr;
ptr = (double*)( (char*)(&cls) ) + 1;
return *ptr;
}
// Эта функция должна предоставить доступ к полю i объекта cls.
// Обратите внимание, что возвращается ссылка на int, т. е.
// доступ предоставляется на чтение и запись.
int &get_i(Cls &cls) {
double* p;
int* ptr;
p = (double*)( (char*)(&cls) ) + 1;
ptr = (int*) (p + 1);
return *ptr;
}