我有一些操作数据库的代码,为此,它需要一个类来将表的行转换为该类。
下面是我现在所讨论类的.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
文件,但是这些函数不需要类,因此我不确定该怎么做。
答案 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 ++功能将是非常有用的资源。