在业余时间从事软件项目时,在设计过程中,我的进度变慢或完全停止了很多次。通常,我会偶然遇到以前遇到过的相同问题。此类反复出现的问题之一是关于让对象知道应该联系哪个对象或拥有它的对象:

假设我们有一个名为Corporation的类startup的实例,其中一个类Supervisor对象和几个类Employee对象可以工作。主管负责向员工分配任务,并在员工要求协助时提供帮助。但是员工必须知道谁是他们的主管,才能报告他们已经完成工作或提出要求。

问题是我如何让员工知道这位主管是谁?我已经提出了几种解决方案,但是在我看来,这些解决方案都没有一个明确的答案。


使Supervisor实例可全局访问,并让所有Employees都直接调用该实例:避免使用全局变量通常是一个好主意,但这是否有例外?我认为不是,如果startup成长为拥有不止一名经理,就会出现问题。
static Supervisor *supervisor类中添加Employee成员:避免使用和与全局访问有关的问题,但是保留了startup增长时,雇员无法向不同的经理报告的问题。
Supervisor *supervisor成员添加到Employee类,并将Supervisor指针传递给每个Employee作为雇员的构造函数的参数:非常灵活,但是在Employee不执行时在内存使用方面效率低下有很多成员变量。
在每次Supervisor成员函数调用中将Employee指针作为参数传递,其中Employee可能需要知道谁是supervisor:最灵活,但效率甚至低于解决方案3,几乎所有成员函数将需要超级用户参数,从而导致额外的开销和不必要的依赖关系。
使Employee成为具有单个非类型参数Supervisor *S的类模板:这将与解决方案1或2一样有效,但更加灵活。但是,尽管可以在运行时更改startup中的雇员数量,但是除非在编译时创建额外的主管但使其不活动,否则不可能在运行时向startup添加更多主管。此外,我不知道如何创建一个复制构造函数,该复制构造函数将一个不同但相似(由模板创建)类型的雇员作为参数。

最佳答案

Employee指向其Supervisor的指针是安排回调或进度报告的传统方法。 (这是您的第三个解决方案。)这只是一个指针。如果您有足够多的员工担心内存的使用(即数千名员工),则可以通过使用较小的句柄而不是指针来减小大小。也就是说,类似

typedef uint8_t SupervisorHandle;

class Employee {
    private:
    SupervisorHandle s;

    Supervisor& getSupervisor() {
        return startup.getSupervisor(s);
    }
    // ...
};


如果将句柄合理地放在其他字段周围,则只需要占用一个字节,现在最多可以有256个主管。但这是以牺牲灵活性为代价的:它使您与静态Corporation实例相关联,并增加了256个超级用户的限制。

您已经注意到答案1和2将您限制为一个Supervisor:如果要这样做,为什么还要上一堂课呢?选项4按方法传递了Supervisor实际上并没有改善:现在Corporation需要有一个将每个Employee链接到正确的Supervisor的映射,并在该映射中查找每个呼叫。只有在您极度短缺的情况下,才引入这种开销来节省一点内存。选项5将您限制为静态分配的Supervisor。您还需要为要从其派生的EmployeeBase类模板创建一个无模板的Employee类,并且除非Employee已经在使用继承,否则vtable开销将耗尽您的内存节省。

关于c++ - C++:信息从子对象到父对象的传播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18653786/

10-08 23:29