Размещение и использование функций и методов - PullRequest
0 голосов
/ 29 августа 2018

У меня есть некоторый код, который манипулирует базой данных, для этого ему нужен класс для перевода строк таблицы в.

Ниже приведена часть файла .h, имеющегося у меня на данный момент для рассматриваемого класса, с его прототипами, которые затем определяются в файле .cpp:

namespace A {
namespace B {
namespace C {

class recEvent
{
public:
  struct filedEvent
  {
    int id;
    std::string title;
    std::string desc;
    std::string stime;
    std::string dur;
    int recid;
    int venid;
  };

  recEvent();
  recEvent(int recid, std::string title, std::string description, int duration,
           recurringType recurType, time_t startFrom, endType endingType,
           time_t dateEnd, int occurences, int venueid);

  void setId(int recid);
  void setTitle(std::string title);
  // ...

  int getId();
  std::string getTitle();
  // ...
};

} // A
} // B
} // C

Затем у меня есть функции-прототипы, которые имеют дело с базой данных в этом заголовке, проблема у меня заключается в том, что эти функции не работают ни с одним из значений в RecEvent, однако они используют классы recEvent для работы [как создание векторов типа recEvent].

Просто чтобы задать вопрос, где было бы лучше объявить / определить эти функции, они не требуют особого присутствия внутри класса, а представляют собой просто набор функций, которые работают вместе для выполнения нескольких запросов к базе данных, таких как так:

Публичный fetchRecEv() прототип метода в заголовке класса recEv:

std::vector<recEvent> fectchRecEv();

определение .cpp:

std::vector<recEvent> recEvent::fetchRecEv()
{
    Pocco::Data::Session* db_session = this->platform->getLocalInterfaceSession();
    Statement ss(*db_session);
    std::vector<recEvent> allRecEv;

    ss < "SELECT Id,Title,Description,Duration,RecurringType,StartFrom,EndType,DateEnd,Occurences,Venueid FROM RecurringEvents", now;
    Poco::Data::RecordSet RecordSet(ss);
    for (auto& record : RecordSet) {
        /*recEvents made and put in vector allRecEv*/
    }
    return allRecEv;
}

У меня возникает желание просто сохранить класс recEvent и создать еще один файл .h специально для этих функций базы данных, однако для этих функций не требуется класс, поэтому я не уверен, что делать дальше. это.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Бесплатные функции являются гражданами первого класса в C ++. Если нет никакой причины для fetchRecEv быть членом class RecEvent, то вполне нормально, что это бесплатная функция.

И все же функция, очевидно, имеет прямое отношение к class RecEvent, что является аргументом в пользу совместного использования того же заголовка. Если бы вы поместили fetchRecEv в его собственный заголовок, тогда этот заголовок все равно должен включать заголовок, объявляющий class RecEvent. Вложенные заголовки не являются настоящим улучшением.

@ Азим предлагает Utils пространство имен. Это, вероятно, плохая идея. Хорошая практика C ++ - хранить свободные функции в пространстве имен, к которому они логически принадлежат. Это становится необходимым, когда вам нужен зависимый от аргумента поиск. Определение operator+ в пространстве имен «utils» просто не будет работать.

0 голосов
/ 29 августа 2018

Лучшим подходом было бы объявить / определить их в отдельных .h / .cpp файлах в пространстве имен Utils. Обратите внимание, что пространство имен Utils это просто идея. Вы должны иметь лучшее представление о том, где логически принадлежат ваши свободные функции и к какому пространству имен.

Например:

В utils.h заголовок:

namespace Utils {

void doSomething();

} // Utils

А в .cpp исходный файл:

namespace Utils {

void doSomething()
{
    // ...
}

} // Utils

Кроме того, у вашего кода были серьезные проблемы с форматированием. Используйте функции форматирования исходного кода в своей среде IDE, чтобы это не занимало много времени.


Вы используете range-for в своем коде, поэтому я предполагаю, что вы работаете по крайней мере с C ++ 11. И есть необработанный указатель, вместо него используйте умные указатели .

Основные положения C ++ был бы весьма полезным ресурсом для безопасного включения функций C ++.

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