2014-02-23 76 views
0

我想讓我的Class B能夠從Class A調用成員函數。解決這個問題的最好方法是什麼?從另一個類C++調用成員函數

對於某些方面,這裏是我的代碼的縮寫版本的片段:

class Time{ 
     public: 
     Time(); 
     Time(int hour, int minute); 
     int time_GetHour() const; 
     ----- 
     private: 
     int hour; 
     int minute; 
    }; 

    int Time::time_GetHour() const{ 
     return hour; 
    } 


    class DaTime{ 
     public: 
     DaTime(); 
     DaTime(Day day, Time start, Time end); 
     dt_Difference(DaTime &a, DaTime &b) const; 

     private: 
     int duration; 
     Time start; 
     Time end; 
    }; 

    int DaTime::dt_Difference(DaTime &a, DaTime &b) const{ 
     int diff_hour = 0; 
     int diff_min = 0; 
     int diff = 0; 

     if(dt_LessThanOrEqual(a,b)){ 
      diff_hour = (b.time_GetHour() - a.time_GetHour())*60; 
      diff_min = b.time_GetHour() - a.time_GetHour(); 
      diff = diff_hour + diff_min; 
      return diff; 
     } 
    } 

我得到的,說明我DaTime類沒有成員time_GetHour(),我可以看到錯誤。我在問什麼是進行修復或繞過此錯誤的最佳方式?謝謝。

+0

這取決於什麼'DaTime'應該是擴展功能或使用'Time'內部。看[這裏](http://stackoverflow.com/q/21692193/1387612)的答案。 – janisz

+0

你想要什麼time_GetHour去做?你爲什麼把'stuff_'放在你的方法名稱之前? – Sneftel

+0

我希望'time_GetHour'只是從'Time'類的實例化中返回一個已經存在的'hour'。 –

回答

3

當你明確你想要使用的Time類內部,而不是繼承它,你可以簡單地通過訪問你所提到的成員變量解決您的問題:

diff_hour = (b.end.time_GetHour() - a.start.time_GetHour())*60; 

但是我不知道,以配合您必要的時間數學與上述樣本。

順便說一句,你有兩個操作數操作示例應該是靜態類函數,甚至全球運算符定義恕我直言。

+0

啊,是的。我大寫'class'只是一個錯誤複製到這裏。感謝你的幫助,我會給你一個機會。 –

+0

@AllenS查看我的更新... –

+0

謝謝。這工作!如果我正確理解這一點,那是因爲我試圖直接訪問該函數而沒有提供正確的成員變量。謝謝。 –

0

您需要Time中的函數才能返回分鐘數。這是一個修訂Time

class Time 
{ 
    public: 
     Time(); 
     Time(int hour, int minute); 
     int time_GetHour() const; 
     int time_GetMinute() const; 
    private: 
     int hour; 
     int minute; 
}; 

int Time::time_GetHour() const 
{ 
    return hour; 
} 

int Time::time_GetMinute() const 
{ 
    return minute; 
} 

您對DaTime的定義有點不清楚。您是否需要存儲startend以及duration?你可以放棄儲存startendduration?輸入Day day服務於DaTime的建設有什麼用途?

如果您已經計算durationDaTime::dt_Difference可以改變一點點地使用duration而不是依靠Time成員函數。

int DaTime::dt_Difference(DaTime &a, DaTime &b) const 
{ 
    int diff = 0; 

    if(dt_LessThanOrEqual(a,b)) 
    { 
     diff = b.duration - a.duration; 
    } 
    return diff; 
} 

但是,你已經decalred DaTime::dt_Difference的方式,這將是難以使用。你必須有這樣的行:

DaTime dt1; 
DaTime dt2; 
DaTime dt3; 
int difference = dt1.dt_Difference(dt2, dt3); 

注意的dt1國家有對dt_Difference的返回值沒有影響。這是如何打算使用它?一個更好的替代方法是改變dt_Difference的聲明是:

int dt_Difference(const DaTime &a) const; 

然後,實施將改變爲:

int DaTime::dt_Difference(const DaTime &a) const 
{ 
    int diff = 0; 

    if(dt_LessThanOrEqual(*this,a)) 
    { 
     diff = b.duration - this->duration; 
    } 
    return diff; 
} 

然後,您的使用情況可改爲:

DaTime dt1; 
DaTime dt2; 
int difference = dt1.dt_Difference(dt2); 

另外,沒有必要具有名稱time_GetHourtime_GetMinutetime是多餘的,因爲你正在處理類Time。您可以將它們更改爲getHourgetSecond。同樣,您也可以將dt_Difference更改爲operator-。您也可以用if (*this <= a)替代if(dt_LessThanOrEqual(*this, a))的使用。第二種形式比第一種形式更具可讀性。

總之,你的代碼可以改成如下所示:

class Time 
{ 
    public: 
     Time(); 
     Time(int hour, int minute); 
     int getHour() const; 
     int getMinute() const; 
    private: 
     int hour; 
     int minute; 
}; 

int Time::getHour() const 
{ 
    return hour; 
} 

int Time::getMinute() const 
{ 
    return minute; 
} 

class DaTime 
{ 
    public: 
     DaTime(); 
     DaTime(Day day, Time start, Time end); 
     int operator-(const DaTime &a) const; 
     bool operator<=(const DaTime& rhs) const; 

    private: 
     int duration; 
}; 

int DaTime::operator-(const DaTime &a) const 
{ 
    int diff = 0; 

    if(a <= *this) 
    { 
     diff = this->duration - a.duration; 
    } 
    return diff; 
} 

DaTime dt1; 
DaTime dt2; 
int difference = dt2 - dt1; 
+0

TL; DR;在這裏回答OP的(主要)問題似乎不需要這種細節...... –