我在寫一個C++ websocket服務器庫。在我提供的一個例子中,我使用了兩個類session_base
和session
。我這樣做的目的是爲了在父類中初始化tcp::socket
對象(使用移動構造函數),然後將引用傳遞給存儲此引用以供將來使用的ws::session<tcp::socket>
父類。我創建ws:session作爲模板類的原因是我可以使用boost::asio::ssl::stream
以及tcp套接字。將對未初始化對象的引用傳遞給超類構造函數,然後用它的移動構造函數初始化所述對象?
難道是有效有tcp::socket
對象session
類的成員,傳遞一個參考這個未初始化對象到ws::session
構造方法(不使用tcp::socket
尚未 - 僅存儲參考),然後初始化tcp::socket
對象之後使用套接字移動構造函數?
當前代碼:
using boost::asio::ip::tcp;
class session_base {
public:
session_base(tcp::socket socket) : socket_(std::move(socket)) { }
protected:
tcp::socket socket_;
};
using T = tcp::socket;
class session : public session_base, public ws::session<T> {
public:
session(tcp::socket socket) :
session_base(std::move(socket)), ws::session<T>(socket_)
{
std::cout << "session()\n";
}
~session() {
std::cout << "~session()\n";
}
private:
void on_open() override {
std::cout << "WebSocket connection open\n";
}
void on_msg(const ws::message &msg) override {
/* Do stuff with msg */
read();
}
void on_close() override {
std::cout << "WebSocket connection closed\n";
}
void on_error() override {
std::cout << "WebSocket connection error\n";
}
};
建議代碼:
下提出的代碼對我的作品,但我想知道這是定義的行爲,並建議。
using boost::asio::ip::tcp;
using T = tcp::socket;
class session : public ws::session<T> {
public:
session(tcp::socket socket) :
ws::session<T>(socket_), socket_(std::move(socket))
{
std::cout << "session()\n";
}
~session() {
std::cout << "~session()\n";
}
private:
tcp::socket socket_;
void on_open() override {
std::cout << "WebSocket connection open\n";
}
void on_msg(const ws::message &msg) override {
/* Do stuff with msg */
read();
}
void on_close() override {
std::cout << "WebSocket connection closed\n";
}
void on_error() override {
std::cout << "WebSocket connection error\n";
}
};
完整的源:https://github.com/alexyoung91/ws
似乎與[將C++對象傳遞給它自己的構造函數合法嗎?](http://stackoverflow.com/q/32608458/1708801) –
將代碼放在問題中,而不是鏈接到您的代碼。 – 1201ProgramAlarm