gpt4 book ai didi

delphi - 在 C++ Builder 中将 TServerSocket 绑定(bind)到特定 IP 地址 (10.1.2)

转载 作者:行者123 更新时间:2023-12-01 19:27:24 27 4
gpt4 key购买 nike

我仍在使用已弃用的 TServerSocket 组件。

我想将 TServerSocket 绑定(bind)到特定 IP。这个问题之前已在本网站中针对 Delphi 提出过:How to Bind a TServerSocket to a specific IP address

但是我无法让它在 C++ Builder 中工作。

我的代码是:

class ServerWrapper : private TServerSocket {
public:
ServerWrapper();

private:

};


ServerWrapper::ServerWrapper()
: TServerSocket (0)
{
//---
}

ServerWrapper* pServer =0;

//...
//..
//.

// And in a function:

pServer = new ServerWrapper;
pServer->Address = "192.168.0.1" ;
pServer->Active = true;

但是它无法编译。它说:E2247 'TAbstractSocket::Address' 不可访问

顺便说一句,我正在使用 C++ Builder 10.1.2 Berlin。

最佳答案

它不起作用,因为您没有正确地将 Delphi 代码转换为 C++。

一方面,您使用的是私有(private)继承,而不是公共(public)继承。因此,从 TServerSocket 继承的所有公共(public)和 protected 成员在 ServerWrapper 中都将是私有(private)的。 Delphi 没有 protected /私有(private)继承的概念,只有公共(public)继承。

但更重要的是,Delphi 有一个隐式友谊的概念。在一个单元内,所有类都可以完全访问同一单元中声明的其他类的私有(private)/ protected 成员。其中包括继承 protected 成员。另一个问题中的 Delphi 示例利用了该功能,通过声明本地帮助器类来隐式获得对声明该帮助器的单元的 Address 属性的公共(public)访问权限。

但是 C++ 没有隐式友谊的概念。要将 Delphi 示例转换为 C++,您必须显式提升对 protected Address 属性的访问。

Delphi 代码的字面翻译在 C++ 中将如下所示:

class TServerSocketAccess : public TServerSocket
{
public:
__property Address;
// or:
// using TServerSocket::Address;
};

((TServerSocketAccess*)ServerSocket1)->Address = "192.168.0.1";
ServerSocket1->Active = true;

应用于您的ServerWrapper类,它看起来像这样:

class ServerWrapper : public TServerSocket
{
public:
ServerWrapper();

__property Address;
// or:
// using TServerSocket::Address;
};

ServerWrapper::ServerWrapper()
: TServerSocket (0)
{
//---
}

ServerWrapper* pServer = 0;
//...
pServer = new ServerWrapper;
pServer->Address = "192.168.0.1";
pServer->Active = true;

关于delphi - 在 C++ Builder 中将 TServerSocket 绑定(bind)到特定 IP 地址 (10.1.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43283947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com