Я хочу, чтобы мой Class B
мог вызвать функцию-член из Class A
Каков наилучший способ приблизиться к этому?
Для некоторого контекста здесь приведены фрагменты сокращенной версии моего кода:
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
о том, что у моего класса DaTime
нет члена time_GetHour()
, который я вижу. Я спрашиваю, что является лучшим способом приблизиться к исправлению или обойти эту ошибку? Благодарю.
По мере того, как вы пояснили, что хотите использовать внутренний класс Time
а не наследовать его, вы можете просто исправить свои проблемы, обратившись к перечисленным вами переменным-членам:
diff_hour = (b.end.time_GetHour() - a.start.time_GetHour())*60;
Тем не менее, я не уверен, чтобы соответствовать вашей необходимой математике времени с образцом выше.
BTW, два экземпляра операции операнда, которые у вас есть, должны быть либо статическими функциями класса, либо даже глобальными определениями операторов IMHO.
class
заглавной буквы был просто ошибкой, копируя его сюда. Спасибо за вашу помощь, и я сделаю это.
Для возврата минут вам понадобится функция во 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
немного неясно. Вам нужно хранить start
и end
а также duration
? Можете ли вы уйти с сохранением start
и end
или duration
? Какая цель служит Day day
для создания DaTime
?
Если вы уже рассчитали duration
, DaTime::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;
}
Тем не менее, способ, которым вы разделили DaTime::dt_Difference
, будет неудобно использовать. У вас должны быть такие строки, как:
DaTime dt1;
DaTime dt2;
DaTime dt3;
int difference = dt1.dt_Difference(dt2, dt3);
Обратите внимание, что состояние dt1
не влияет на возвращаемое значение dt_Difference
. Это как использовать его? 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_GetHour
и time_GetMinute
. time
избыточно, так как вы имеете дело с классом Time
. Вы можете изменить их на getHour
и getSecond
. Аналогично, вы также можете изменить dt_Difference
на operator-
. Вы также можете заменить использование if(dt_LessThanOrEqual(*this, a))
, if ( *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;
DaTime
должно расширять функциональность или использоватьTime
внутреннего использования. Смотрите здесь для ответа.stuff_
перед именами своих методов?