Мне кажется, это хороший трюк Реми Лебо показал мне, но больше не может найти QA ...
//---------------------------------------------------------------------------
#ifndef _TDirectMemoryStream
#define _TDirectMemoryStream
class TDirectMemoryStream:TMemoryStream // just for accessing protected SetPointer
{
public:
void SetMemory(BYTE *ptr,DWORD siz) { SetPointer(ptr,siz); Position=0; };
};
#endif
//---------------------------------------------------------------------------
Вы просто создаете новый класс, который является потомком классаВы хотите получить доступ.Теперь просто добавьте функции get / set для защищенных членов ...
Теперь используется:
TMemoryStream *mem=new TMemoryStream(); // original class instance you want to access
// overtype to our new class and access/use you get/set ...
((TDirectMemoryStream*)(mem))->SetMemory(hdr->lpData,hdr->dwBytesUsed);
delete mem; // release if not needed anymore
Я использую его, кстати, для подачи потока памяти с данными пользовательской памяти hdr
с камеры VFW, чтобы я мог правильно декодировать его, используя класс TJPEGImage
вместо записи данных в файл и загрузки его обратно каждый кадр ...
Вот еще один пример:
class A
{
protected:
int x;
public:
int getx(){ return x; }
};
class hack_A:A
{
public:
void setx(int _x){ x=_x; }
};
void test()
{
A a;
hack_A *ha=(hack_A*)&a;
ha->setx(10);
a.getx(); // print the x somwhere
}
Однакоэто не будет работать для частных пользователей ... В этом случае это тоже выполнимо, но требует доступа к A
исходному коду:
class A
{
protected:
int x;
private:
int y;
public:
int getx(){ return x; }
int gety(){ return y; }
friend class hack_A; // but this one requires access to A soourcecode
};
class hack_A:A
{
public:
void setx(int _x){ x=_x; }
void sety(int _y){ y=_y; }
};
void test()
{
A a;
hack_A *ha=(hack_A*)&a;
ha->setx(10);
ha->sety(20);
a.getx(); // print the x somwhere
a.gety(); // print the x somwhere
}