Как реализовать трюк с доступом к защищенным членам Delphi в C ++ builder? - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужен доступ к TControlItem.InternalSetLocation, который защищен.Я Delphi, вы бы сделали

type
  THackControlItem = class(TControlItem);

Как вы делаете это в C ++ Builder?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Как и в Delphi, вам нужно унаследовать класс, но также переопределить и сделать общедоступной защищенную функцию.Однако я бы не рекомендовал использовать его в рабочем коде.

class THackControlItem : public TControlItem
{
public:
    void __fastcall InternalSetLocation(int AColumn, int ARow, bool APushed, bool MoveExisting)
    {
        TControlItem::InternalSetLocation(AColumn, ARow, APushed, MoveExisting);
    }
};

В программе

TControlItem* ci = ...;
static_cast<THackControlItem*>(ci)->InternalSetLocation(...);
0 голосов
/ 21 ноября 2018

Мне кажется, это хороший трюк Реми Лебо показал мне, но больше не может найти 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
    }
...