Примечание: База кода, над которой я работаю, соответствует стандарту 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) {}
^