0

在将软件项目作为业余爱好工作时,我的进度在设计过程中多次减慢或完全停止。通常我会偶然发现我以前遇到过的相同问题。此类反复出现的问题之一是让对象知道它应该联系什么对象或拥有它的对象是什么:

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

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

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

1 回答 1

1

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需要有一个将 each 链接Employee到 right的映射Supervisor,并且每次调用都在该映射中查找。引入这种开销来节省一点内存是你只有在极度短缺的情况下才会做的事情。选项 5 将您限制为静态分配Supervisor的 s。您还需要为要派生EmployeeBase的类模板创建一个无模板的类,除非已经使用继承,否则 vtable 开销会耗尽您节省的内存。EmployeeEmployee

于 2013-09-06T09:23:49.613 回答