关于boost.asio里面的socket的私有性的问题

本文深入探讨了在使用Boost库与asio库进行服务端开发时遇到的典型编译错误,特别是关于头文件错误和成员变量构造函数调用的误区。通过实例分析,揭示了错误根源,并提供了有效的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做一个服务端,刚开始使用boost库不是很熟练的使用,所以呢也出现了一点很蠢的问题。

首先就是编了一晚上都不过的问题,而且还是头文件报错,其实也没什么就是这样一个类

class Handle : public boost::enable_shared_from_this<Handle>
{
     public:
	   Handle(boost::asio::io_service &io_ser)
	   {
	   	  socket_ = new boost::asio::ip::tcp::socket(io_ser);
	   }
	 	 void run();
	 	 boost::asio::ip::tcp::socket * get_socket();
	 private:
	 	 void ReadHandler(const boost::system::error_code& error, size_t bytes_transferred);
	 	 boost::asio::ip::tcp::socket  socket_;
	 	 char sbuf_[1024];
};

首先它这个错误提示的就让人很容易想歪,我还以为是不是没有加什么库?

但是不是的,在构造函数里面找了N久。才发现其实问题是出现在构造的时候,函数本身看起来没毛病

Handle.h: 在构造函数‘Handle::Handle(boost::asio::io_service&)’中:
Handle.h:39:5: 错误: 对‘boost::asio::basic_stream_socket<boost::asio::ip::tcp>::basic_stream_socket()’的调用没有匹配的函数
Handle.h:39:5: 附注: 备选是:
/usr/local/include/boost/asio/basic_stream_socket.hpp:134:3: 附注: boost::asio::basic_stream_socket<Protocol>::basic_stream_socket(boost::asio::io_context&, const protocol_type&, const native_handle_type&) [with Protocol = boost::asio::ip::tcp, boost::asio::basic_stream_socket<Protocol>::protocol_type = boost::asio::ip::tcp, boost::asio::basic_stream_socket<Protocol>::native_handle_type = int]
但是对于类里面的成员变量类,会在初始化的时候调用相应的默认构造。因而是socket_对象的问题,虽然Handle类在构造函数里面没有对socket变量操作,但是还是会调用它的构造函数的。

这一点被我忽视了,我现在还不知道为什么直接把这个类放在自己定义的类里面不可以,可能就像报错一样说这个是私有的,但是它却可以被定义为指针,放在类里面被使用。

修改方法:将变量定义为指针

天啊,简直不讲道理,找到了错误的根源就很好改了,和别人的代码找一下不同就可以了。如果有大佬知道为什么,请一定要分享给我哦。谢谢

好了,菜鸡的我也许应该回过头看一看c++了,拷贝构造都忘了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值