Разделение кода на заголовки / исходные файлы - PullRequest
3 голосов
/ 06 апреля 2010

Я взял следующий код со страницы примеров на 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 ]

1 голос
/ 06 апреля 2010

Разделение этого может выглядеть так:

// 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; определяет псевдоним для типа и остается в заголовке.

Чтобы понять суть разделения классов, посмотрите здесь и здесь . Чтобы понять причину отказа от этого, посмотрите здесь . Причина отсутствия разделения, которая следует из предыдущих двух, заключается в том, что таким образом вам не нужно ничего связывать, чтобы использовать класс. Вы должны только включить заголовок. Надеюсь, что это даст вам отправную точку.

0 голосов
/ 06 апреля 2010

Вы можете разбить код класса шаблона на файл реализации, вы включаете этот файл в заголовочный файл.ACE (Adaptive Communication Framework) интенсивно использует эту процедуру.Поэтому я рекомендую вам проверить это.

0 голосов
/ 06 апреля 2010

с шаблонами, очень типично реализовывать их прямо в заголовочном файле.

это, вероятно, самое простое решение проблем связывания, которое может появиться, если вы попытаетесь реализовать функции шаблона в файле cpp.

см. faq для получения дополнительной информации.

...