Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:信息从子对象传播到父对象_C++_Oop - Fatal编程技术网

C++ C++;:信息从子对象传播到父对象

C++ C++;:信息从子对象传播到父对象,c++,oop,C++,Oop,当我把软件项目作为一种业余爱好来工作时,我已经有很多次在设计过程中进度减慢或完全停止。通常,我会偶然发现我以前遇到过的相同问题。其中一个反复出现的问题是让对象知道它应该接触什么对象,或者什么对象拥有它: 假设我们有一个名为startup的classCorporation实例,其中一个classSupervisor对象和几个classEmployee对象工作。主管负责向员工分配任务,并在员工请求协助时提供帮助。但是,员工必须知道谁是他们的主管,才能报告他们已经完成了任务,或者要求什么 问题是我如何

当我把软件项目作为一种业余爱好来工作时,我已经有很多次在设计过程中进度减慢或完全停止。通常,我会偶然发现我以前遇到过的相同问题。其中一个反复出现的问题是让对象知道它应该接触什么对象,或者什么对象拥有它:

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

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

  • 主管
    实例可以全局访问,让所有
    员工
    直接调用该实例:避免全局访问通常是个好主意,但这会是个例外吗?我不这么认为,如果
    初创公司
    有一个以上的经理,问题就会出现
  • 静态主管*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位)的管理指针开销。我根本想象不出这是个问题。