【问题标题】:design problem - inheritance with static variables设计问题 - 静态变量的继承
【发布时间】:2010-09-12 05:45:21
【问题描述】:

我有以下层次结构:

Graduate.cpp  (abstract)
   College.cpp  (abstract)
      Ecollege.cpp
   University.cpp (abstract)
      Tuniversity.cpp
      Huniversity.cpp  

例如 Huniversity 类代表从 H 大学毕业的学生。 每个非抽象类都必须实现在 Graduate.h 中定义的以下方法:

    virtual double CalcGraduateAvg() = 0;

Tuniversity 有来自 Huniversity 的使用信息。此信息存储在静态变量中。 例如,Tuniversity 标头和实现:

#include "University.h"
#define AVG_FACTOR 5

class Tuniversity : public University {
public:
    Tuniversity(int id, char identifier, double salary, double grades);
    virtual double CalcGraduateAvg();

protected:
    static int _numTGrads;
    static double _sumTGrades;
};

#include "Tuniversity.h"
#include "Huniversity.h"

//initialize static variables:
int Tuniversity::_numTGrads = 0;
double Tuniversity::_sumTGrades = 0;

Tuniversity::Tuniversity(int id, char identifier, double salary, double grades)
    : University(id,identifier, salary, grades) {

    _numTGrads++;
    _sumTGrades += grades;
}

double Tuniversity::CalcGraduateAvg() {

//HERE I CAN'T access sumHGrades and numHGrades since it's private
    double A = Huniversity::_sumHGrades / Huniversity::_numHGrads;
    double T = _sumTGrades / _numTGrads;
    _normalizedGradesAvg = A / T * _gradesAvg + AVG_FACTOR;
    return _normalizedGradesAvg;

}

我的设计问题是 Tuniv' 如何从 Huniv' 读取数据(两个静态变量)。 除了两个类都继承大学这一事实之外,它们之间没有联系。 我不想公开这些变量,因为它是错误的。 我不想创建一个非静态虚函数 GetAvg(),因为它会迫使我创建对象以获取数据。 我试图制作虚拟静态功能,但这是不可能的。 你认为这个问题有很好的解决方案吗(我宁愿不实现静态 Tuni' 和 Huniv 中的函数 GetAvg() 将返回数据,因为如果我扩展我的程序,例如添加 Muniv' 没有接口强制类实现该 GetAvg() 函数,所以我认为该选项是一个糟糕的设计)。 据我所知,这个问题没有很好的解决方案。 在每节课中使用 2 个静态变量是我的练习要求,在我要求助教更改该要求之前,我希望与您协商。

谢谢大家!

【问题讨论】:

  • 是的,我已经读过它了...抱歉,我不知道我会从现在开始标记
  • 对我来说,您的继承层次结构看起来并不正确——我不会使用继承来解决这个问题。一方面,您不能代表拥有两个学位的学生。

标签: c++


【解决方案1】:

例如 Huniversity 类代表从 H 大学毕业的学生

那么你为什么称这个类为Huniversity而不是Hstudent

我认为您将大学和学生混合在一起并将它们放在同一个班级中(因为您说代表学生的班级中还有代表每个大学信息的静态成员)。大学可以包含(指向)学生对象的向量,其中每个学生对象都包含其成绩。

我将为学生引入单独的课程,并使学生人数和成绩总和的静态成员非静态,并添加方法GetAvg()

【讨论】:

    【解决方案2】:

    你说TUnivHUniv之间没有联系。你错了。如果TUniv 的平均值是根据HUniv 确定的,就是一个连接。

    并且应该以某种方式对这种连接进行建模。如果这种联系只发生在这两种大学类型之间,您可以使用friend 声明轻松解决。但也许这些类需要更广泛的接口。

    由于 C++ 没有反射,因此设置一个用于表示毕业生所在大学的对象可能是个好主意。顺便说一句,这也更好地反映了现实世界:一个毕业生实际上是从一个机构毕业的。

    如果您这样做,机构(对象)可以保留对其毕业生的引用。不同的指标可以定义为大学对象上的成员函数TUniv 对象的指标函数将需要对其HUniv 连接的显式引用(参数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-28
      • 2016-12-14
      • 2016-09-10
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      相关资源
      最近更新 更多