Нужна помощь в преобразовании структур в класс - PullRequest
0 голосов
/ 23 апреля 2020

Примечание: База кода, над которой я работаю, соответствует стандарту C ++ 98.

Я пытался преобразовать этот код, который был настроен как структуры, в формат класса для лучше использовать с программой, над которой я работаю.

В исходном коде я могу понять, как преобразовать struct interval_timer в класс ( на основе моих исследований отсюда ), однако у меня возникают проблемы при попытке конвертировать разделы как struct abc_timer : interval_timer. Я думаю, вы понимаете, что по сути это говорит "создайте структуру abc_timer в классе interval_timer, но при компиляции моего кода я получаю несколько ошибок.

Оригинальный код

#include <boost/asio.hpp>
#include <iostream>
#include <boost/bind.hpp>
using boost::posix_time::millisec;
using boost::posix_time::seconds;
typedef boost::posix_time::microsec_clock Clock;
using boost::system::error_code;

struct interval_timer
{
  interval_timer(boost::asio::io_context &io, millisec i)
      : interval(i), timer(io)
  {
    run();
  }

  virtual bool callback() = 0;

  void run()
  {
    timer.expires_from_now(interval);
    timer.async_wait(boost::bind(&interval_timer::on_timer, this, boost::asio::placeholders::error()));
  }

  void stop()
  {
    timer.cancel();
  }

private:
  void on_timer(error_code ec)
  {
    if (!ec && callback())
      run();
  }
  millisec const interval;
  boost::asio::deadline_timer timer;
};

int main()
{
  boost::asio::io_context io;

  struct abc_timer : interval_timer
  {
    abc_timer(boost::asio::io_context &io, millisec i) : interval_timer(io, i) {}
    virtual bool callback()
    {
      std::cout << "TEST_ABC" << std::endl;
      return true;
    }
  } abc(io, millisec(200));

  struct counter_timer : interval_timer
  {
    counter_timer(boost::asio::io_context &io, millisec i, interval_timer &abc)
        : interval_timer(io, i), abc(abc), current(0) {}

    virtual bool callback()
    {
      std::cout << "COUNTER AT " << ++current << std::endl;

      if (current < 5)
        return true;

      abc.stop();
      return false;
    }

  private:
    interval_timer &abc;
    int current;
  } counter(io, millisec(1000), abc);

  io.run();
}

Моя попытка преобразования

#include <boost/asio.hpp>
#include <iostream>
#include <boost/bind.hpp>
using boost::posix_time::millisec;
using boost::posix_time::seconds;
typedef boost::posix_time::microsec_clock Clock;
using boost::system::error_code;

boost::asio::io_service io;

class Interval_Timer
{
public:
  Interval_Timer(boost::asio::io_service &io, millisec i);

  virtual bool callback() = 0;
  // boost::asio::io_service io;

public:
  void run();
  void stop();
  void on_timer(error_code ec);

  millisec const interval;
  boost::asio::deadline_timer timer;


public: 
  struct abc_timer
  {
    abc_timer(boost::asio::io_service &io, millisec i) : Interval_Timer(io, i) {}
    virtual bool callback()
    {
      std::cout << "TEST_ABC" << std::endl;
      return true;
    }
  } abc(io, millisec(200));

  struct counter_timer
  {
    counter_timer(boost::asio::io_service &io, millisec i, Interval_Timer &abc)
        : Interval_Timer(io, i), abc(abc), current(0) {}

    virtual bool callback()
    {
      std::cout << "COUNTER AT " << ++current << std::endl;

      if (current < 5)
        return true;

      abc.stop();
      return false;
    }

  private:
    Interval_Timer &abc;
    int current;
  }counter(io, millisec(1000), abc);
};

Interval_Timer::Interval_Timer()
{
}

Interval_Timer::Interval_Timer(boost::asio::io_service &io, millisec i)
    : interval(i), timer(io)
{
  run();
}

Interval_Timer::~Interval_Timer()
{
  std::cout << " DECONSTRUCTED " << std::endl;
}

void Interval_Timer::run()
{
  timer.expires_from_now(interval);
  timer.async_wait(boost::bind(&Interval_Timer::on_timer, this, boost::asio::placeholders::error()));
}

bool Interval_Timer::callback()
{
  std::cout << "TEST_ABC" << std::endl;
  return true;
}

void Interval_Timer::on_timer(error_code ec)
{
  if (!ec && callback())
    run();
}

Для таких строк, как }counter(io, millisec(1000), abc); Я получаю следующую ошибку:

error: ‘io’ is not a type

и

error: expected ‘)’ before numeric constant

А для инициализаторов:

/src/timerTest/execTimer.cpp: In constructor ‘Interval_Timer::counter_timer::counter_timer(boost::asio::io_service&, boost::posix_time::millisec, Interval_Timer&)’:
/src/timerTest/execTimer.cpp:181:11: error: type ‘Interval_Timer’ is not a direct base of ‘Interval_Timer::counter_timer’
         : Interval_Timer(io, i), abc(abc), current(0) {}
           ^

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

struct abc_timer : interval_timer означает, что abc_timer наследует от interval_timer, например, он получает все свои члены и методы. Преобразование этого в классы будет class abc_timer : public interval_timer

0 голосов
/ 23 апреля 2020

Поскольку io - это значение, которое передается конструктору Interval_Timer, его нельзя использовать как часть значения по умолчанию для abc или counter. Вам нужно будет использовать список инициализатора члена для Interval_Timer coustructor.

Interval_Timer::Interval_Timer(boost::asio::io_service &io, millisec i)
    : interval(i), timer(io), abc(io, millisec(100)), counter(io, millisec(1000), abc)
{
    // ...
}

Ваши определения для abc и counter должны быть изменены только на имя переменной и потерять параметры.

    // ...
    } abc;
    // ...
    } counter;

Конструктор по умолчанию для Interval_Timer должен быть удален, так как конструкторы для abc и counter должны предоставить значение для io. Или вам нужно предоставить новые конструкторы для этих двух классов, чтобы их можно было использовать в конструкторе по умолчанию без указания io_service.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...