【问题标题】:Bind TServerSocket to a specific IP address in C++ Builder (10.1.2)将 TServerSocket 绑定到 C++ Builder (10.1.2) 中的特定 IP 地址
【发布时间】:2017-04-07 17:28:07
【问题描述】:

我仍在使用已弃用的 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 Berlin。

【问题讨论】:

  • 感谢您至少承认它已被弃用 :-)

标签: delphi c++builder


【解决方案1】:

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

一方面,您使用的是 private 继承而不是 public 继承。所以从TServerSocket 继承的所有公共和受保护成员在ServerWrapper 中都是私有的。 Delphi 没有受保护/私有继承的概念,只有公共继承。

但更重要的是,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;

【讨论】:

  • 不添加“__property地址;”行到 ServerWrapper 类的公共部分,所有公共、受保护和私有继承产生相同的错误结果。但当然,当我添加“__property Address;”时在公共继承中它现在可以工作了:)
  • @Aethon 是的,因为AddressTServerSocket 中被声明为protected,所以你需要一个public 声明来向公众宣传它
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2023-02-12
相关资源
最近更新 更多