Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在C++;建设者_Delphi_C++builder_C++builder 10.2 Tokyo - Fatal编程技术网

Delphi 如何在C++;建设者

Delphi 如何在C++;建设者,delphi,c++builder,c++builder-10.2-tokyo,Delphi,C++builder,C++builder 10.2 Tokyo,我需要访问受保护的TControlItem.InternalSetLocation。我想你会的 type THackControlItem = class(TControlItem); 你如何在C++ Builder中做这个?< /P> < P>这是一个很好的把戏,我想我已经看出来了,但是再也找不到QA了…… //--------------------------------------------------------------------------- #ifndef\u t直接

我需要访问受保护的TControlItem.InternalSetLocation。我想你会的

type
  THackControlItem = class(TControlItem);

你如何在C++ Builder中做这个?< /P> < P>这是一个很好的把戏,我想我已经看出来了,但是再也找不到QA了……

//---------------------------------------------------------------------------
#ifndef\u t直接存储器流
#定义\u t直接内存流
类TDirectMemoryStream:TMemoryStream//仅用于访问受保护的SetPointer
{
公众:
void SetMemory(BYTE*ptr,DWORD siz){SetPointer(ptr,siz);Position=0;};
};
#恩迪夫
//---------------------------------------------------------------------------
您只需创建一个新类,该类是要访问的类的后代。现在只需为受保护的成员添加get/set函数

现在用法:

TMemoryStream*mem=newtmemoryStream();//要访问的原始类实例
//改写为我们的新类并访问/使用您获取/设置的。。。
((TDirectMemoryStream*)(mem))->SetMemory(hdr->lpData,hdr->dwBytesUsed);
删除mem;//如果不再需要,请释放
我正在使用它来提供一个带有来自vfw摄像机的自定义内存数据
hdr
的内存流,这样我就可以使用
TJPEGImage
类对其进行正确解码,而不是将数据写入文件并将其加载回每一帧

这里是另一个例子:

A类
{
受保护的:
int x;
公众:
int getx(){return x;}
};
A班:A班
{
公众:
void setx(int x){x=x;}
};
无效测试()
{
A A;
hack_A*ha=(hack_A*)&A;
ha->setx(10);
a、 getx();//在何处打印x
}
但是这对私人会员不起作用。。。在这种情况下,它也是可行的,但需要访问
A
源代码:

A类
{
受保护的:
int x;
私人:
int-y;
公众:
int getx(){return x;}
int gety(){return y;}
friend类hack_A;//但是这个类需要访问soourcecode
};
A班:A班
{
公众:
void setx(int x){x=x;}
void sety(int_y){y=_y;}
};
无效测试()
{
A A;
hack_A*ha=(hack_A*)&A;
ha->setx(10);
ha->sety(20);
a、 getx();//在何处打印x
a、 gety();//在何处打印x
}

在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(...);
TControlItem*ci=。。。;
静态转换(ci)->内部设置位置(…);

即使在Delphi中,这也只适用于受保护的成员,而不是私有成员。访问私人成员的唯一方法是通过RTTI,AFAIK。你提到的黑客被称为“受保护的黑客”是有原因的;-)。它仅适用于受保护的成员。是。很抱歉我修正了这个问题。@HeartWare:RTTI仅在为私人成员启用RTTI时有效。也有帮手黑客(尽管如此,即使在类帮手bug或多或少被关闭之后)。当然,这些在C++中是不起作用的。所以我会在Delphi中这样做,公开这些值,这样C++就可以访问它们。我在博客上写道:Spektre&Rudy:当然没有人会改变vcl源代码来实现这一点,THackControlItem是TControlItem的后代,我只是想澄清一下,friend类通常不起作用,“但只在后代类中起作用”,谢谢。但在我的情况下,这将不起作用,因为我将不得不重新实现InternalSetLocation,它需要访问私有字段(而不是方法)。@Rigel并不重要,您可以将自定义代码作为子类的方法编写,或者为需要的每个变量添加get/set。。。如果你看一下我的代码,我正在从原始类访问方法
SetPointer
和变量
Position
。如果您将get/set方法设置为公共方法,您可以在类之外轻松地使用它们……在InternalSetLocation中,我需要向FPushed写入私有的内容。它有一个getter(函数TControlItem.getpush:Boolean),但没有setter。在这种情况下,如何向FPushed写入?@rigel您只需将setter写入后代类。。。就像我将
SetMemory
添加到我的中一样……你的意思是,我在我的后代类中重新声明FPushed并为它编写一个getter和setter?你可能说得有道理,但我想不通。