C++ 嵌套类还是非嵌套类?

C++ 嵌套类还是非嵌套类?,c++,scheduler,nested-class,C++,Scheduler,Nested Class,我有一个类和一个对象列表。A有一个函数f,应该每X秒执行一次(对于第一个实例,每1秒执行一次;对于第二个实例,每5秒执行一次,等等)。 我有一个调度器类,负责在正确的时间执行函数。 我想做的是创建一个新类,ATime,它将把ptr保存到一个实例中,并保存执行a::f的时间。调度程序将保留一个Atime的最小优先级队列 你认为这是正确的实施方式吗 ATime应该是调度器的嵌套类吗 从你描述的情况来看,这听起来似乎是可行的:-) IMHO classATime属于调度程序多于属于A。调度程序必须完成

我有一个类和一个对象列表。A有一个函数f,应该每X秒执行一次(对于第一个实例,每1秒执行一次;对于第二个实例,每5秒执行一次,等等)。 我有一个调度器类,负责在正确的时间执行函数。 我想做的是创建一个新类,ATime,它将把ptr保存到一个实例中,并保存执行a::f的时间。调度程序将保留一个Atime的最小优先级队列

  • 你认为这是正确的实施方式吗
  • ATime应该是调度器的嵌套类吗

  • 从你描述的情况来看,这听起来似乎是可行的:-)


    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
    {
    布尔运算符