У меня есть класс с объектом в качестве члена, который не имеет конструктора по умолчанию. Я хотел бы инициализировать этот элемент в конструкторе, но кажется, что в 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 :: розеткой и моих исследований я понял, что 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++
В качестве альтернативы вы можете быть в состоянии депортировать вычисление происходящего в организме во внешней функции: 'udp_sock(): _sock (myfunc()) {} ' –