У меня есть класс с объектом в качестве члена, который не имеет конструктора по умолчанию. Я хотел бы инициализировать этот член в конструкторе, но кажется, что в C ++ я не могу этого сделать. Вот этот класс:
#include <boost/asio.hpp>
#include <boost/array.hpp>
using boost::asio::ip::udp;
template<class T>
class udp_sock
{
public:
udp_sock(std::string host, unsigned short port);
private:
boost::asio::io_service _io_service;
udp::socket _sock;
boost::array<T,256> _buf;
};
template<class T>
udp_sock<T>::udp_sock(std::string host = "localhost",
unsigned short port = 50000)
{
udp::resolver res(_io_service);
udp::resolver::query query(udp::v4(), host, "spec");
udp::endpoint ep = *res.resolve(query);
ep.port(port);
_sock(_io_service, ep);
}
Компилятор в основном говорит мне, что не может найти конструктор по умолчанию для udp :: socket, и по моим исследованиям я понял, что C ++ неявно инициализирует каждый член перед вызовом конструктора. Есть ли способ сделать это так, как я хотел, или это слишком "ориентировано на Java" и неосуществимо в C ++?
Я обошел проблему, определив мой конструктор так:
template<class T>
udp_sock<T>::udp_sock(std::string host = "localhost",
unsigned short port = 50000) : _sock(_io_service)
{
udp::resolver res(_io_service);
udp::resolver::query query(udp::v4(), host, "spec");
udp::endpoint ep = *res.resolve(query);
ep.port(port);
_sock.bind(ep);
}
Так что мой вопрос скорее из любопытства и для лучшего понимания ООП в C ++