将代码拆分为标题/源文件

时间:2010-04-06 12:47:57

标签: c++ header-files

我从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 ++感到困惑。

3 个答案:

答案 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并保留在标题中。

要了解拆分课程的基本原理,请查看herehere。要了解不这样做的理由,请查看here。从前两个不分裂的原因是,这样你就不必链接任何东西来使用该类。您只需要包含标题。希望能给你一个起点。

答案 1 :(得分:0)

使用模板,在头文件中直接实现它们非常典型。

如果您尝试在cpp文件中实现模板函数,这可能是解决链接问题的最简单方法。

请参阅此faq了解详情。

答案 2 :(得分:0)

您可以将模板类代码拆分为实现文件,将此文件包含在头文件的和。 ACE(自适应通信框架)大量使用此过程。因此,我建议你看看。