2017-04-07 122 views
2

我仍使用不推荐使用的TServerSocket组件。将TServerSocket绑定到C++ Builder中的特定IP地址(10.1.2)

我想将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属性。

一个字面翻译德尔福代码看起来像在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; 
+0

不添加“__property地址;”行到ServerWrapper类的公共部分,所有public,protected和private继承产生了相同的错误结果。但是当然当我添加“__property地址”时在公共继承它现在的作品:) – Aethon

+0

@Aethon是的,因为'地址'在'TServerSocket'中声明为'protected',所以你需要一个'public'语句来将它公诸于众 –