C++ 函数和方法的放置和使用

C++ 函数和方法的放置和使用,c++,function,methods,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;

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

下面是我现在拥有的有关类的
.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
类型的向量]

只是想问一个问题,在哪里最好声明/定义这些函数,它们并不特别需要在类中,它们只是一组函数,它们一起工作以执行两个数据库查询,如下所示:

类头中的public
fetchRecEv()
方法原型
recEv

std::vector<recEvent> fectchRecEv();

我很想让
recEvent
类保持简单,并专门为这些数据库函数创建另一个
.h
文件,但是这些函数不需要类,因此,我不知道该如何进行。

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

例如:

utils.h
标题中:

namespace Utils {

void doSomething();

} // Utils
.cpp
源文件中:

namespace Utils {

void doSomething()
{
    // ...
}

} // Utils

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


您正在代码中使用,因此我假设您至少使用C++11。还有一个原始指针,请改用


将是一个非常有用的资源,可以安全地合并C++特性。

最好的方法是在单独的<代码> > h < />代码> /<代码> .CPP < /Cord>文件> <代码> UTIs< /Calp>命名空间中声明/定义这些。请注意,名称空间
Utils
只是一个想法。您应该更好地了解自由函数在逻辑上属于哪个名称空间以及属于哪个名称空间

例如:

utils.h
标题中:

namespace Utils {

void doSomething();

} // Utils
.cpp
源文件中:

namespace Utils {

void doSomething()
{
    // ...
}

} // Utils

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


您正在代码中使用,因此我假设您至少使用C++11。还有一个原始指针,请改用


将是一个非常有用的C++ C++安全资源。

自由函数是C++中的第一类公民。如果没有理由让
fetchRecEv
成为
类RecEvent
的成员,那么它完全可以成为自由函数

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


@Azem建议使用
Utils
名称空间。那可能是个坏主意。将自由函数保存在它们逻辑上属于的命名空间中是很好的C++实践。当您需要依赖于参数的查找时,这一点变得非常重要。在“UTILS”命名空间中定义<代码>运算符+<代码>将不起作用。

自由函数是C++中的第一类公民。如果没有理由让
fetchRecEv
成为
类RecEvent
的成员,那么它完全可以成为自由函数

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


@Azem建议使用
Utils
名称空间。那可能是个坏主意。将自由函数保存在它们逻辑上属于的命名空间中是很好的C++实践。当您需要依赖于参数的查找时,这一点变得非常重要。在“utils”名称空间中定义
运算符+
根本不起作用。

我更喜欢使用(非静态)成员方法
fetchRecEvent
的不同
someClass
(具有有意义的名称),而不是普通的全局函数。如果您愿意,它可以帮助您以后修改代码,例如,使用派生的
SomeInheritedClass
获取记录,而对客户端代码很少修改或不修改。在任何情况下,我都会避免在
recEvents
类中使用方法
fetchRecEvent
(也可以命名为
loadRecEventsFromDatabase
)。google for Single Responsibility Principle(SRP)@GianPaolo:为什么引入人工类只是为了让
fetchRecEvent
成为成员?拥有
SomeInheritedClass
不是一个参数。是的,您现在可以在客户端代码中将
SomeBaseClass::fetchRecEvent()
更改为
SomeInheritedClass::fetchRecEvent()
。这比将客户端代码更改为
fetchRecEvent\u with retry()
-两者都是名称更改,但是
SomeInheritedClass
会引入另一个不必要的类。@m我将使用一些工厂模式:使用一个方法
CreateRecEventLoader
,它返回一个
共享的ptr
,客户机代码将使用这样的东西
auto loader=CreateRecEventLoader();loader->fetchRecEvent()。当稍后您将引入一个从文件而不是从数据库读取的加载程序时,只需修改factory方法并重试即可