Answer the question
In order to leave comments, you need to log in
Accessing private fields via pointer arithmetic?
Task text: all fields of this class are private, your task is to implement several functions that give full access to these fields (see code template), despite the fact that they are private.
/*
* Класс 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;
}
Answer the question
In order to leave comments, you need to log in
Can you please explain how exactly all this is arranged in memory?
c
will be at offset 0 in the object, the field will d
be at offset 8, and the field will i
be at offset 16. With this in mind, pointer games acquire meaning.Task text: all fields of this class are private, your task is to implement several functions that give full access to these fields (see code template), despite the fact that they are private.
Formally, from the point of view of OOP, this cannot be done. I do not know the product tasks where such a malicious hack would take place.
And the teacher who came up with this - you need to tear off the balls.
if there are no virtual methods, then we can assume that the data goes in a row. in fact, you need to correctly access the desired memory location. Read about memory alignment.
In reality, if you need to bypass access restrictions, then this can be done, for example, like this:
/*
* Класс Cls определен точно таким образом:
*
* struct Cls {
* Cls(char c, double d, int i);
* private:
* char c;
* double d;
* int i;
* };
*
*/
namespace {
// Cls_Double - точная копия Cls в смысле расположения данных.
// Важный момент - данные в Cls НЕ скрыты, но видимы с ограничением доступа (что разные вещи)
// Это позволяет делать дубликат класса всегда
struct Cls_Double {
char c;
double d;
int i;
};
}
// Эта функция должна предоставить доступ к полю c объекта cls.
// Обратите внимание, что возвращается ссылка на char, т. е.
// доступ предоставляется на чтение и запись.
char &get_c(Cls &cls) {
return reinterpret_cast<Cls_Double&>(cls).c;
}
// Эта функция должна предоставить доступ к полю d объекта cls.
// Обратите внимание, что возвращается ссылка на double, т. е.
// доступ предоставляется на чтение и запись.
double &get_d(Cls &cls) {
return reinterpret_cast<Cls_Double&>(cls).d;
}
// Эта функция должна предоставить доступ к полю i объекта cls.
// Обратите внимание, что возвращается ссылка на int, т. е.
// доступ предоставляется на чтение и запись.
int &get_i(Cls &cls) {
return reinterpret_cast<Cls_Double&>(cls).i;
}
return *(char *)((std::uint8_t*)&cls);
return *(double *)((std::uint8_t*)&cls + sizeof(char));
return *(int *)((std::uint8_t*)&cls + sizeof(char) + sizeof(double));
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question