我有以下層次:設計問題 - 繼承與靜態變量
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個靜態變量是我的練習要求,我希望在請求我的TA改變這個要求之前與您協商。
謝謝大家!
可能http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern?看看'對象counter' – Anycorn 2010-09-11 21:08:26
是的,我已經讀到它......對不起,我不知道我會從現在開始 – 2010-09-11 21:09:25
標記向我你的繼承層次結構並沒有真正看的權利 - 我不會爲這個使用繼承問題。一方面,你不能代表一個擁有_兩個學位的學生。 – 2010-09-11 21:14:09