C++ 嵌套类还是非嵌套类?
我有一个类和一个对象列表。A有一个函数f,应该每X秒执行一次(对于第一个实例,每1秒执行一次;对于第二个实例,每5秒执行一次,等等)。 我有一个调度器类,负责在正确的时间执行函数。 我想做的是创建一个新类,ATime,它将把ptr保存到一个实例中,并保存执行a::f的时间。调度程序将保留一个Atime的最小优先级队列C++ 嵌套类还是非嵌套类?,c++,scheduler,nested-class,C++,Scheduler,Nested Class,我有一个类和一个对象列表。A有一个函数f,应该每X秒执行一次(对于第一个实例,每1秒执行一次;对于第二个实例,每5秒执行一次,等等)。 我有一个调度器类,负责在正确的时间执行函数。 我想做的是创建一个新类,ATime,它将把ptr保存到一个实例中,并保存执行a::f的时间。调度程序将保留一个Atime的最小优先级队列 你认为这是正确的实施方式吗 ATime应该是调度器的嵌套类吗 从你描述的情况来看,这听起来似乎是可行的:-) IMHO classATime属于调度程序多于属于A。调度程序必须完成
从你描述的情况来看,这听起来似乎是可行的:-)
IMHO class
ATime
属于调度程序多于属于A。调度程序必须完成其工作,而A不需要它。事实上,A(以及世界其他地区)甚至不需要知道它的存在-因此,将它放在调度器的私有嵌套类中对我来说是合适的。这种类最好是嵌套在调度器类中的私有结构,这样您就可以轻松访问调度器类中的所有字段。(默认情况下,结构的所有字段都是公共的。)至于第二部分(以及标题中的问题),我认为这完全是一个品味问题。您也可以选择减少调度器类定义中的混乱,并将ATime放在带有警告名称的子名称空间中(如detail
),以防止人们使用它。毕竟,如果它只对调度器有用,那么不需要太多地隐藏它——反正没有人会想使用它
在C++0x中可能会有所不同(我想我听过一些谣言,说它将如何改变嵌套类和父类之间的可访问性规则,或者这样,在这种情况下,嵌套可能更值得)
对于泛型,您可能还希望使用模板,并可能最终使用
调度程序(使用时间操作)(或者对其进行无数潜在的改进/概括)这可能有点太高级了,但接下来
并且可以用来实现一个调度器,该调度器不需要知道关于类a的任何信息。这将使您的调度器更加通用和可重用
以下是一些示例代码,说明了如何在您的案例中使用这些增强功能:
#include <ctime>
#include <queue>
#include <boost/function.hpp>
#include <boost/bind.hpp>
struct Foo
{
void onScheduler(time_t time) {/*...*/}
};
struct Bar
{
void onScheduler(time_t time) {/*...*/}
};
typedef boost::function<void (time_t)> SchedulerHandler;
struct SchedulerEvent
{
bool operator<(const SchedulerEvent& rhs) const {return when < rhs.when;}
SchedulerHandler handler;
time_t when;
};
class Scheduler
{
public:
void schedule(SchedulerHandler handler, time_t when)
{
SchedulerEvent event = {handler, when};
queue_.push(event);
}
private:
std::priority_queue<SchedulerEvent> queue_;
void onNextEvent()
{
const SchedulerEvent& next = queue_.top();
next.handler(next.when);
queue_.pop();
}
};
int main()
{
Scheduler s;
Foo f1, f2;
Bar b1, b2;
time_t now = time(0);
s.schedule(boost::bind(&Foo::onScheduler, &f1, _1), now + 1);
s.schedule(boost::bind(&Foo::onScheduler, &f2, _1), now + 2);
s.schedule(boost::bind(&Bar::onScheduler, &b1, _1), now + 3);
s.schedule(boost::bind(&Bar::onScheduler, &b2, _1), now + 4);
// Do scheduling...
return 0;
}
#包括
#包括
#包括
#包括
结构Foo
{
在调度程序上无效(时间){/*…*/}
};
结构条
{
在调度程序上无效(时间){/*…*/}
};
typedef boost::函数SchedulerHandler;
结构SchedulerEvent
{
布尔运算符