设计问题 - 使用静态变量继承

时间:2010-09-11 21:00:09

标签: c++

我有以下层次结构:

Graduate.cpp  (abstract)
   College.cpp  (abstract)
      Ecollege.cpp
   University.cpp (abstract)
      Tuniversity.cpp
      Huniversity.cpp  
例如,班级大学代表了一所毕业于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(),因为它会强制我创建和对象以获取数据。 我试图制作虚拟静态功能,但这是不可能的。 你认为这个问题有一个很好的解决方案(我宁愿不实现静态 函数GetAvg()在Tuni'和Huniv中将返回数据,因为如果我扩展我的程序,例如添加Muniv'没有强制类实现GetAvg()函数的接口,所以我认为该选项是一个糟糕的设计)。 据我所知,这个问题没有很好的解决方案。 在每个班级使用2个静态变量是我的练习要求,我希望在我要求我的TA改变该要求之前咨询你。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

  例如,班级大学代表了一所毕业于H大学的学生

那么为什么要将此课程称为Huniversity而不是Hstudent

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

我会为学生介绍单独的课程,并为学生数量和非静态成绩总和制作静态成员,并添加方法GetAvg()

答案 1 :(得分:0)

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

这种联系应该以某种方式建模。如果仅在这两种大学类型之间发生这种联系,您可以使用friend声明轻松解决此问题。但也许这些课程需要更广泛的界面。

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

如果你这样做,机构(一个对象)可以继续引用它的毕业生。可以在大学对象上将不同的度量标准定义为成员函数,并且TUniv对象的度量函数将需要对其HUniv连接的显式引用(参数)。