需要帮助将结构转换为类
Need help converting structs to class
注意:我正在使用的代码库是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
构造函数的值,所以不能将其用作abc
或counter
的默认值的一部分。您需要使用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)
{
// ...
}
abc
和counter
的定义应更改为仅变量名,并丢失参数。
// ...
} abc;
// ...
} counter;
应该删除Interval_Timer
的默认构造函数,因为abc
和counter
的构造函数需要为io
提供一个值。或者,您需要为这两个类提供新的构造函数,以便它们可以在默认构造函数中使用,而不必指定io_service。
相关文章:
- JSON转换为nlohmann JSON-lib中的结构数组
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 从成员指针到整个结构/类的强制转换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将字符数组转换为时间结构
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- i2d_X509_REQ_INFO无法正确转换req_info结构
- 在C++中将结构转换和存储为二进制
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 转换包含向量 C++ 的语法和结构
- 正在转换结构数据的字节序
- 如何大致将 cpp 代码结构转换为 python
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- C++ 向下转换结构
- 尝试在C++中转换结构时出现奇怪的错误消息
- 向向下转换结构添加属性值会导致分段错误
- C++基于子类型动态强制转换结构
- 从字节缓冲区强制转换结构
- c++中的类型转换结构
- c++的类型转换结构指针指向类型值