哪一个更好,指向其他类的指针或从该类继承

时间:2012-08-14 15:34:51

标签: c++ class inheritance pointers

我想知道哪个是解决此问题的更好方法:

教师可以教授多个科目,也可以考虑实验室以外的所有科目,也可以兼任研究所。 LabSubjectTeacher也有一些其他变量。我没有在这里写这些。 可以单独添加新lab,subject and teacher。添加教师后,我只输入Teacher classlabCode以及subCode的所有变量。有一些预定义的实验室和主题以及稍后添加的其他实验室和主题。如果可以的话,我可以查看显示他的实验室和主题详细信息的教师记录。

我在c ++中的概念不是太强,我不知道哪一个更好。我应该将Teacher类中的指针指向Lab和Subject类,还是应该将其固有,或者是否有更好的方法来执行此操作。

class Lab{
    char labCode[20];
    char labName[40];
        int labYear;
    //here default constructor 
};
class Subject{

    char subCode[20];
    char subName[20];
        int subYear;
    //here default constructor 
};
//-------------------------------------
class Teacher{
    char facName[30];
    int teacherSubCount;
        int teacherLabCount;
    Subject *subject;
        Lab *lab;
    //here default constructor 

};
//------------or should i do like this--------------
class Teacher:public Lab,public Subject{
   char teacherName[30];
    int teacherSubCount;
        int teacherLabCount; 
   //here default constructor 

};

如果您可以推荐任何教程,那么我可以学习指针的强大功能,因为我的书中指出“指针是非常强大的c ++”,但它们只给出了一些简单的例子:)

6 个答案:

答案 0 :(得分:4)

  

“赞成'对象组合'超过'类继承'。” - Gang of Four

更具体地说,你的课程首先要问自己......“教师是一种实验室还是一种主体?”显然,答案是“不”。

在继承模型中,子类本身应该是父类的实例。考虑Liskov Substitution Principle,该子对象应该可以作为该父对象处理。因此,如果有代码正在寻找Subject,您可以将Teacher传递给它。直觉上,这没有多大意义,也不能准确表示正在建模的现实领域实体。

在这种情况下,您肯定需要对象组合而不是类继承。 Teacher 有一个 Lab有一个 Subject,而是一个 Lab }或 Subject。实际上,如果Teacher可以拥有多个LabSubject s,那么组合只会从单个实例类成员更改为数组或列表某种。在这种情况下,继承方法会完全破坏。

在对代表这样的现实世界概念的对象进行建模时,请考虑最重要的现实世界概念的直觉以及实现次要的技术捷径。如果在建模的方面没有意义,那么它在代码中也没有意义。

答案 1 :(得分:3)

考虑一下'is-a'(用于继承)和'has-a'(用于聚合)关系是否在您提出的解决方案中有意义

Teacher既不是Lab也不是Subject - 我认为您应该使用汇总解决方案。

但是,在开始使用代码之前,您真正需要完全排序的是数据模型。您需要确定对象之间的关系和多重性(即一对一,一对多等)。

答案 2 :(得分:3)

继承意味着“is-a”关系,而指针意味着“has-a”关系。

老师是实验室吗?老师是一个学科吗?不,它有一个主题,它有一个实验室,所以它是一个“有一个”的关系。所以你应该使用指针,在这种情况下。

当你试图改变教师的实验室时,为什么继承不起作用会变得明显。您可以轻松更改指针指向的对象,但替换基类的所有数据会更加麻烦。

举一个例子,你将使用继承,EnglishTeacher可以继承教师,因为它也是一名教师,但具有额外的能力。

答案 3 :(得分:1)

采用常识方法:

继承表示is-a关系。显然老师 既不是Subject也不是Lab,这将是一个严肃的目光 序幕。所以我要说聚合(has-ahas-many)就是这样的 去。

您还需要决定是否使用值语义 或引用语义。这意味着平等将是实际的平等 程序中的对象或通过某些对象可以计算 对象的一部分。

如果你使用引用语义,你需要确保你是 使用智能指针或其他形式的内存管理,否则 事情很快变得丑陋。

答案 4 :(得分:1)

继承类时,如上一个示例所示,将其视为扩展该类的现有定义行为。那么,请问自己一个问题:“老师”是否增强了“实验室”的能力?对我来说,答案很清楚 - 他们没有 - 他们是完全不同的对象,因此继承不是在问题域中对这些元素进行建模的理想方式。老师一个类,一个一个主题,等等 - 因此,聚合似乎是一个更好的方法。

答案 5 :(得分:0)

如果你看一下这个例子,你会理解这个概念:

void doExperimentsIn( Lab &room ){...}

如果您从Teacher派生Lab,您也可以在Teacher内进行实验。 (这很愚蠢。)