C++ C++;:信息从子对象传播到父对象
当我把软件项目作为一种业余爱好来工作时,我已经有很多次在设计过程中进度减慢或完全停止。通常,我会偶然发现我以前遇到过的相同问题。其中一个反复出现的问题是让对象知道它应该接触什么对象,或者什么对象拥有它: 假设我们有一个名为C++ C++;:信息从子对象传播到父对象,c++,oop,C++,Oop,当我把软件项目作为一种业余爱好来工作时,我已经有很多次在设计过程中进度减慢或完全停止。通常,我会偶然发现我以前遇到过的相同问题。其中一个反复出现的问题是让对象知道它应该接触什么对象,或者什么对象拥有它: 假设我们有一个名为startup的classCorporation实例,其中一个classSupervisor对象和几个classEmployee对象工作。主管负责向员工分配任务,并在员工请求协助时提供帮助。但是,员工必须知道谁是他们的主管,才能报告他们已经完成了任务,或者要求什么 问题是我如何
startup
的classCorporation
实例,其中一个classSupervisor
对象和几个classEmployee
对象工作。主管负责向员工分配任务,并在员工请求协助时提供帮助。但是,员工必须知道谁是他们的主管,才能报告他们已经完成了任务,或者要求什么
问题是我如何让员工知道谁是主管?我提出了几个解决方案,但在我看来,没有一个是明确的答案
主管
实例可以全局访问,让所有员工
直接调用该实例:避免全局访问通常是个好主意,但这会是个例外吗?我不这么认为,如果初创公司
有一个以上的经理,问题就会出现静态主管*Supervisor
成员添加到Employee
类:这避免了全局访问的使用以及与全局访问相关的问题,但保留了员工在初创公司
成长时无法向不同经理报告的功能Supervisor*Supervisor
成员添加到Employee
类,并将Supervisor
指针作为员工构造函数的参数传递给每个Employee
:非常灵活,但在Employee
没有太多成员变量时,内存使用效率低下主管
指针作为参数传递给员工
成员函数的每次调用,员工
可能需要知道谁是主管:最灵活,但效率可能低于解决方案3,几乎所有成员函数都需要主管参数,导致额外的开销和不必要的依赖性Employee
成为具有单个非类型参数的类模板Supervisor*S
:这将与解决方案1或2一样有效,但更灵活。但是,虽然可以在运行时更改startup
中的员工数量,但在运行时向startup
添加更多的主管是不可能的,除非在编译时创建了额外的主管,但未激活。此外,我不知道如何创建一个副本构造函数,该构造函数将一个不同但相似(模板创建)类型的员工作为参数给
员工
一个指向其主管的指针
是安排回调或进度报告的传统方法。(这是你的第三个解决方案。)只有一个指针。如果您有足够多的员工担心内存使用(即数千名员工),您可以使用较小的句柄而不是指针来减小内存大小。就是说,
typedef uint8_t SupervisorHandle;
class Employee {
private:
SupervisorHandle s;
Supervisor& getSupervisor() {
return startup.getSupervisor(s);
}
// ...
};
如果在其他字段周围合理地放置句柄,则只需占用一个字节,现在最多可以有256个监视器。但这是以灵活性为代价的:它将您与静态的公司
实例联系在一起,并添加了256名主管这一不明显的限制
您已经注意到,您的答案1和2将您限制为一个
主管:如果您要这样做,为什么还要上课?选项4,让每个方法传递主管
,实际上并没有什么改进:现在公司
需要有一个映射,将每个员工
链接到右侧的主管
,并在该映射中查找每个呼叫。引入这种开销以节省一点内存是只有在极度短缺时才会做的事情。选项5将您限制为静态分配的Supervisor
s。您还需要为要派生的Employee
类模板创建一个无模板的EmployeeBase
类,除非Employee
已经在使用继承,否则vtable开销将耗尽您的内存存储。我当前最喜欢的解决方案是第5个,假设可以创建一个工作副本构造函数,因为我的项目可以使用一组固定的等效于“Manager”对象。在分析并确定Supervisor*
指针与其他内存使用相比确实是程序内存浪费的一个重要来源之后,您是否得出了这个问题?否则,这似乎是一个明显的过早优化的例子,您不应该让它在设计阶段“减慢或完全停止”您的开发。使用概念正确的最简单解决方案--3。如果发现问题,请稍后修改您的解决方案。主管不是员工吗?不同的部门呢?人力资源部和发展部是否有同一名主管?如果您将开发分成几个团队呢?唯一合理的解决方案是#3,你永远不会有足够的员工让每个员工一个指针有任何意义。一旦你这样做了,你就可以使用一个数据库,这样你就不需要一次将所有员工都存储在内存中。即使这家公司是一家拥有大约100万员工的初创公司,你也会有大约8MB(64位)的管理指针开销。我根本想象不出这是个问题。