我仍在使用已弃用的TServerSocket组件。
我想将TServerSocket绑定到特定的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柏林。
答案 0 :(得分:0)
它没有用,因为你没有正确地将Delphi代码翻译成C ++。
首先,您使用私有继承而不是公开继承。因此,从TServerSocket
继承的所有公开成员和受保护成员都将在ServerWrapper
中保密。 Delphi没有受保护/私有继承的概念,只有公共继承。
但更重要的是,德尔福有一种隐性友谊的概念。在一个单元中,所有类都可以完全访问在同一单元中声明的其他类的私有/受保护成员。其中包括继承的受保护成员。另一个问题中的Delphi示例利用了该功能,通过声明本地帮助程序类隐式获取对声明帮助程序的单元的Address
属性的公共访问。
但是C ++没有内隐友谊的概念。要将Delphi示例翻译为C ++,您必须明确宣传对受保护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;