我在写一个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