【发布时间】:2015-12-28 19:19:20
【问题描述】:
我正在编写一个 C++ websocket 服务器库。在我提供的一个示例中,我使用了两个类session_base 和session。我这样做是为了让session_base 父类中的tcp::socket 对象初始化(使用移动构造函数),然后再将它的引用传递给ws::session<tcp::socket> 父类,该父类存储此引用以供以后使用。我创建 ws:session 作为模板类的原因是我可以使用boost::asio::ssl::streams 以及 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";
}
};
【问题讨论】:
-
将您的代码放在问题中,而不是指向您的代码的链接。