Как функции утилит могут быть разделены между различными классами? - PullRequest
0 голосов
/ 21 октября 2010

У меня был класс Display с 2 служебными функциями getDate и getTime, как показано ниже.

class Display
{
public:
  void getDate(char *pDate); //Utility functions for converting to custom format
  void getTime(char *pTime);
};

Позже, в другом классе, называемом Retriever, мне также требовались те же функции Utility getDate и getTime.Я не хочу делать функции getDate и getTime глобальными (или C-подобными функциями), чтобы избежать случайного использования этих функций (которые специфичны для этих двух классов).Даже завертывание их в пространство имен не предотвратит случайное использование.

Display и Retriever - это разные классы.Не могу использовать наследство между ними.Невозможно использовать композицию и агрегацию, поскольку время жизни объектов этих классов будет другим.Они не существуют вместе (одновременно).

Есть ли какой-нибудь хороший способ вывести функции Utility из Display и использовать их в обоих классах Display и Retriever?Хорошо ли помещать getDate и getTime в отдельный класс с именем Utilities и использовать его объект в классах Display и Retriever?

Ответы [ 3 ]

2 голосов
/ 21 октября 2010

На основании вашей дополнительной информации в комментарии / обсуждении, например, getDate не зависит от данных экземпляра, getDate и getTime не должны быть нестатическими функциями-членами. В идеале они должны быть автономными функциями. Возможно в пространстве имен.

Поместите их и другие связанные вещи в отдельный модуль.

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

Поместите функции в пространство имен, например, например. timeutil или название библиотеки, что угодно.

И я рекомендую изменить их так, чтобы они возвращали std::string вместо использования необработанных аргументов указателя, например

#include <string>

namespace timeutil {
    std::string timeString();
    std::string dateString();
}

Приветствия & hth.,

1 голос
/ 21 октября 2010

Я думаю, что использование пространства имен будет наиболее подходящим.Вы можете выбрать имя для этого пространства имен, чтобы все знали о его назначении:

namespace DisplayRetrieverImplementation {
  void getDate(char *pDate); //Utility functions for converting to custom format
  void getTime(char *pTime);
}
0 голосов
/ 21 октября 2010

Вы можете сделать ваши функции закрытыми статическими членами другого класса.И подружись с дисплеем и ретривером этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...