需要帮助将结构转换为类

Need help converting structs to class

本文关键字:转换 结构 帮助      更新时间:2024-03-29

注意:我正在使用的代码库是C++98标准。

我一直在尝试将这个被配置为structs的代码转换为类格式,以便更好地用于我正在开发的程序。

在最初的代码中,我可以理解如何将struct interval_timer转换为类(基于我在这里的研究(,但在尝试转换像struct abc_timer : interval_timer这样的部分时,我似乎遇到了问题。我想我理解这是在本质上说"在类interval_timer中创建结构abc_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) {}
^

struct abc_timer : interval_timer意味着abc_timer从interval_timer继承,例如它获得了它的所有成员和方法。将其转换为类将是class abc_timer : public interval_timer

因为io是传递给Interval_Timer构造函数的值,所以不能将其用作abccounter的默认值的一部分。您需要使用Interval_Timer库构造函数的成员初始值设定项列表。

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

abccounter的定义应更改为仅变量名,并丢失参数。

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

应该删除Interval_Timer的默认构造函数,因为abccounter的构造函数需要为io提供一个值。或者,您需要为这两个类提供新的构造函数,以便它们可以在默认构造函数中使用,而不必指定io_service。