2017-04-07 130 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'語句來將它公諸於衆 –