我从Asio的示例页面中获取了以下代码
class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service)
{
return pointer(new tcp_connection(io_service));
}
tcp::socket& socket()
{
return socket_;
}
void start()
{
message_ = make_daytime_string();
boost::asio::async_write(socket_, boost::asio::buffer(message_),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
private:
tcp_connection(boost::asio::io_service& io_service)
: socket_(io_service)
{
}
void handle_write(const boost::system::error_code& /*error*/,
size_t /*bytes_transferred*/)
{
}
tcp::socket socket_;
std::string message_;
};
我对C ++相对较新(来自C#背景),根据我的理解,大多数人会将其拆分为头文件和源文件(分别为声明/实现)。如果我要在许多源文件中使用它,是否有任何理由我不能将它留在头文件中?如果是这样,是否有任何工具会自动将其转换为声明/实现?有人可以告诉我这看起来像是分成标题/源文件的例子(或者只是它的一部分,无论如何)?我对这个奇怪的东西感到困惑typedef boost::shared_ptr<tcp_connection> pointer;
我是否在头文件或源代码中包含它?与tcp::socket& socket()
我已经阅读了很多教程,但这一直让我对C ++感到困惑。
答案 0 :(得分:1)
拆分可能如下所示:
// in the header-file
class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& io_service);
tcp::socket& socket();
void start();
private:
tcp_connection(boost::asio::io_service& io_service);
void handle_write(const boost::system::error_code& /*error*/,
size_t /*bytes_transferred*/);
tcp::socket socket_;
std::string message_;
};
// in the cpp-file
// #using the namespace in which the class was declared here
tcp_connection::pointer tcp_connection::create(boost::asio::io_service& io_service)
{
return pointer(new tcp_connection(io_service));
}
tcp::socket& tcp_connection::socket()
{
return socket_;
}
void tcp_connection::start()
{
message_ = make_daytime_string();
boost::asio::async_write(socket_, boost::asio::buffer(message_),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
tcp_connection::tcp_connection(boost::asio::io_service& io_service)
: socket_(io_service)
{
}
void tcp_connection::handle_write(const boost::system::error_code& /*error*/,
size_t /*bytes_transferred*/)
{
}
基本上,所有方法实现都已移至cpp文件。 typedef boost::shared_ptr<tcp_connection> pointer;
defines an alias for a type并保留在标题中。
要了解拆分课程的基本原理,请查看here和here。要了解不这样做的理由,请查看here。从前两个不分裂的原因是,这样你就不必链接任何东西来使用该类。您只需要包含标题。希望能给你一个起点。
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以将模板类代码拆分为实现文件,将此文件包含在头文件的和。 ACE(自适应通信框架)大量使用此过程。因此,我建议你看看。