功能和方法的放置和使用

时间:2018-08-29 10:46:36

标签: c++ function methods

我有一些操作数据库的代码,为此,它需要一个类来将表的行转换为该类。

下面是我现在所讨论类的.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 :(得分:2)

自由功能是C ++中的一等公民。如果没有理由fetchRecEv成为class RecEvent的成员,那么完全免费就可以了。

然而,该函数显然与class RecEvent直接相关,这是一个赞成共享同一标头的参数。如果您将fetchRecEv放在其自己的标头中,则该标头仍需要包含声明class RecEvent的标头。嵌套标头并不是真正的改进。

@Azeem建议使用Utils命名空间。那可能是个坏主意。将自由函数保留在逻辑上属于它们的命名空间中是一种很好的C ++做法。当您需要依赖于参数的查询时,这变得至关重要。在“ utils”命名空间中定义operator+根本行不通。

答案 1 :(得分:0)

最好的方法是在.h命名空间下的单独.cpp / Utils文件中声明/定义这些文件。请注意,名称空间Utils只是一个想法。您应该有一个更好的主意,自由函数在逻辑上属于哪个空间,并属于哪个名称空间。

例如:

utils.h标头中:

namespace Utils {

void doSomething();

} // Utils

并且,在.cpp源文件中:

namespace Utils {

void doSomething()
{
    // ...
}

} // Utils

除此之外,您的代码还存在一些严重的格式设置问题。利用您的IDE的源代码格式设置功能,这样就不会花费很多时间。


您在代码中使用range-for,所以我假设您至少使用C ++ 11。而且,这里有一个原始指针,请改用smart pointers

C++ Core Guidelines对于安全地合并C ++功能将是非常有用的资源。