Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;自由函数的源代码组织_C++ - Fatal编程技术网

C++ c++;自由函数的源代码组织

C++ c++;自由函数的源代码组织,c++,C++,我想开始更喜欢自由(非成员)函数而不是成员函数——在本文之后 我习惯于用这种方式组织我的C++类,我有声明的 CordNe.H./Cu> >和 CordNe.c>代码>实现。 ClassName.h : struct ClassName { ClassName(); void setData( unsigned data ); }; 然后就开始实施了 ClassName.C : #include "ClassName.h" ClassName::ClassName()

我想开始更喜欢自由(非成员)函数而不是成员函数——在本文之后

<>我习惯于用这种方式组织我的C++类,我有声明的<代码> CordNe.H./Cu> >和<代码> CordNe.c>代码>实现。

ClassName.h :

struct ClassName { 
    ClassName();
    void setData( unsigned data );
};
然后就开始实施了

ClassName.C :

#include "ClassName.h"

ClassName::ClassName() { dosomething(); };
void setData( unsigned data ) { dootherthings(); }; 
那么,当我想要一个自由函数
adjustClassData()
时,如何组织代码呢? 我还想把这个函数放到名称空间中

//Bar.h
namespace foo{
class Bar{}
}
假设
ClassName
位于
namespace foo
中,那么我也会将自由函数放入
namespace foo
中:

namespace foo {
    void adjustClassData( ClassName & inObj );
}
我正在寻找
名称空间
的各个方面以及文件名的建议


我正在寻找一些最佳实践——因为在规范文件组织的标准中没有C++规则。

如果没有太多,可以将特定的类处理的自由函数放在类头和实现文件中。


否则,提出一个命名约定,并将它们放在一个单独的头文件和实现文件中(例如ClassNameFunctions.h/.cpp)。

如果您希望用自由函数替换成员函数,我假设这些自由函数与所讨论的类密切相关。在这种情况下,它们不应该公开。我会选择匿名内部名称空间:

//myclass.h
namespace myNamespace
{
   class MyClass
   { 
      void foo();
   };
}

//myclass.cpp
#include "myclass.h"
namespace myNamespace
{
   namespace
   {
      void helper() {};
   }
   void MyClass::foo()
   {
   }
}

我建议将自由函数的声明放在一个单独的头中,因为它们不是类本身的一部分,但是我会将它们放在同一个名称空间中

//Bar.h
namespace foo{
class Bar{}
}
在声明自由函数的标题中,我将对类本身使用前向声明

//BarHelper.hpp
namespace foo{
class Bar;
void somefunc(&Bar);
}
像往常一样在单独的文件中实现

现在我正在浏览大量的头文件,这些头文件中混合了几个类和自由函数的声明和定义。这真是一种痛苦


所以亲吻;)

使用
.c
作为文件扩展名可能会导致问题。例如,MSVC将把它编译成C而不是C++。这是一篇很好的文章。一个(重要的)注意:类< /Cord>方法负责维护类不变量,自由函数应该只使用那些方法来实现更粗粒度的任务。你说得对,Windows不会歧视,这意味着MSVC会造成问题。但是其他系统会区分,而且还有一些项目使用C/C来区分C++和C代码。@ CarstenGreiner:对于你已经得到的“命名空间方面”,没有人可以添加任何东西。属于公共接口的任何内容都应该与类位于同一命名空间中。你可能想了解ADL是如何工作的,但如果你遵循你建议的规则,不做任何太棘手的事情,它会做你想做的事情。因此,文件名是唯一的问题。我认为他是在建议将公共界面从成员函数移到自由函数(因为这就是引用的文章的内容),这意味着这不相关。+1,但有一个小建议:即使有足够的函数来保证ClassNameFunctions.cpp的定义,我仍然会将声明放在ClassName.h而不是ClassNameFunctions.h中。或者,在ClassName.h中包含ClassNameFunctions.h。因为您通常希望通过只包含ClassName.h来获得ClassName的完整公共接口。