【发布时间】: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 个静态变量是我的练习要求,在我要求助教更改该要求之前,我希望与您协商。
谢谢大家!
【问题讨论】:
-
可能是en.wikipedia.org/wiki/Curiously_recurring_template_pattern?看
Object counter -
是的,我已经读过它了...抱歉,我不知道我会从现在开始标记
-
对我来说,您的继承层次结构看起来并不正确——我不会使用继承来解决这个问题。一方面,您不能代表拥有两个学位的学生。
标签: c++