Вызов функции-члена из другого класса C ++

0

Я хочу, чтобы мой 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(), который я вижу. Я спрашиваю, что является лучшим способом приблизиться к исправлению или обойти эту ошибку? Благодарю.

  • 0
    Это зависит от того, что DaTime должно расширять функциональность или использовать Time внутреннего использования. Смотрите здесь для ответа.
  • 0
    Что вы хотите time_GetHour делать? И почему вы помещаете stuff_ перед именами своих методов?
Показать ещё 3 комментария
Теги:
class
inheritance

2 ответа

3
Лучший ответ

По мере того, как вы пояснили, что хотите использовать внутренний класс Time а не наследовать его, вы можете просто исправить свои проблемы, обратившись к перечисленным вами переменным-членам:

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

Тем не менее, я не уверен, чтобы соответствовать вашей необходимой математике времени с образцом выше.

BTW, два экземпляра операции операнда, которые у вас есть, должны быть либо статическими функциями класса, либо даже глобальными определениями операторов IMHO.

  • 0
    О да. Мой class заглавной буквы был просто ошибкой, копируя его сюда. Спасибо за вашу помощь, и я сделаю это.
  • 0
    @AllenS посмотри мои обновления ...
Показать ещё 1 комментарий
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 немного неясно. Вам нужно хранить 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;
  • 0
    TL; DR; Подобные подробности, по-видимому, не нужны для ответа на (основной) вопрос ОП здесь ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню