2010-09-11 15 views
2

我有以下層次:設計問題 - 繼承與靜態變量

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改變這個要求之前與您協商。

謝謝大家!

+0

可能http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern?看看'對象counter' – Anycorn 2010-09-11 21:08:26

+0

是的,我已經讀到它......對不起,我不知道我會從現在開始 – 2010-09-11 21:09:25

+0

標記向我你的繼承層次結構並沒有真正看的權利 - 我不會爲這個使用繼承問題。一方面,你不能代表一個擁有_兩個學位的學生。 – 2010-09-11 21:14:09

回答

1

例如類Huniversity代表一個學生,從以H大學

畢業那你爲什麼調用這個類Huniversity而不是Hstudent

我覺得你混合的大學和學生並把它們放到同一個類(因爲你也有代表在其中你說代表一個學生一類的每所大學的信息靜態成員)。該大學可以包含(指向)學生對象的向量,其中每個學生對象包含它的檔次。

我將介紹不同的課程,讓學生,使靜態成員的學生人數和等級的總和非靜態,並添加方法GetAvg()

0

你說TUnivHUniv之間沒有關係。你錯了。如果根據HUniv確定TUniv的平均值,則表示的連接爲

而且該連接應該以某種方式建模。如果僅在這兩種大學類型之間發生這種連接,則可以通過使用friend聲明輕鬆解決。但也許這些類需要更廣泛的接口。

由於C++沒有反思,建立一個用於表示畢業生的大學的對象可能是一個好主意。順便說一句,這也反映了現實世界的更好:畢業生實際上是在一個機構畢業。

如果你這樣做,該機構(一個對象)可以保持對畢業生的引用。關於大學對象的不同度量標準可以定義爲成員函數,並且TUniv對象的度量函數將需要明確引用(參數)到它的HUniv連接。