Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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++_File_Class - Fatal编程技术网

C++ 我应该把类放在C++;?

C++ 我应该把类放在C++;?,c++,file,class,C++,File,Class,我问这个问题是为了组织我的代码。是的。一般来说,每对.h/.cpp一个类。文件应该在类之后命名。< P>C和C++约定是每个库的一个头文件,或者是库的一个部分,而不是每个类的一个头文件。试着把相关的课程分组在一起。例如,在标准库中,既包含std::set又包含std::multi_set,但这些模板的功能非常相似 虽然-Boost.asio有一个包含很多内容的大头文件,但对于公共头文件没有任何真正一致的规则。Boost.DateTime被合理地划分为较低的级别,尽管仍然没有达到单一类型的级别 如

我问这个问题是为了组织我的代码。

是的。一般来说,每对.h/.cpp一个类。文件应该在类之后命名。

< P>C和C++约定是每个库的一个头文件,或者是库的一个部分,而不是每个类的一个头文件。试着把相关的课程分组在一起。例如,在标准库中,
既包含
std::set
又包含
std::multi_set
,但这些模板的功能非常相似

虽然-Boost.asio有一个包含很多内容的大头文件,但对于公共头文件没有任何真正一致的规则。Boost.DateTime被合理地划分为较低的级别,尽管仍然没有达到单一类型的级别

如果愿意,可以将成员函数的实现放在每个类的一个源文件中。即使你遵循GNU-C风格,每一个函数都有一个源文件,虽然我认为我不建议C++。而且,您可以通过让面向公共的头文件包含多个单独的头文件来实现它们

它可能和其他任何东西一样依赖于您的版本控制和构建过程——更改一个类而不涉及任何包含与该类无关内容的文件是很方便的,因为这样最简单的重建和更改日志就可以清楚地识别从文件名更改的内容。但类不一定是所谓“无关代码”的边界


例如,如果您正在使用迭代器编写集合,或者使用某种框架注册侦听器的类,侦听器将在该框架中对主类进行操作,那么将它们分开没有多大意义。从道德上讲,这些是“内部类”,即使你没有将它们作为嵌套类实现在C++中。

它取决于应用程序。对于某些应用程序,如果紧密耦合,将不同的类分组到一组.h/.cpp文件中是有意义的。否则,将类拆分为头文件和源文件的标准肯定是正确的方法。

我喜欢将相关类保留在同一个文件中

例如,如果我有一个函子在不同类中的For_each循环中使用,那么我通常不会将它放在它自己的文件中。这似乎太过分了——并且将代码与过度使用代码的地方分隔开来


不过,一般来说,我会尝试将这些类分开,并尝试为.hpp文件创建一个合理的树结构,将它们的使用分组在一起。在这棵树的最前面,我希望有一个包含整个库的catch-all头文件。

是的,在单独的cpp文件中保留单独的类,然后使用类名命名这些文件是一个很好的做法。事实上,java迫使你这么做。

如果你这样做有意义的话,你应该把C++类放在不同的文件中。对于设计良好的类,它通常是这样的。它便于编码、维护、模块化、重构和重用

然后是MyClass.h,它包含
classmyclass{…}
和MyClass.cpp,MyClass.cpp包含
MyClass
的所有方法

如果你有很多小班课,这会有点疯狂,所以考虑一下几个选项:

  • 以名称空间命名的文件,例如MyNamespace.h、MyNamespace.cpp
  • 嵌套类-将类定义封装在另一个类中有意义吗?这样做意味着嵌套类在没有父类的情况下不太可能有用
<> P>避免使用一组额外的命名约定,通过使每个文件名与C++命名空间或类名一致,避免了需要想出新的名字或从一个约定转换为另一个约定。p>
谷歌风格指南也有自己的观点,更喜欢带下划线的文件名。请参见

可能的重复项。您最好根据编译器的功能进行调用。为项目中的每个类加载和初始化.cpp文件可能会导致相当残酷的编译时间。@paperjam:我使用.cpp文件的唯一原因(好吧,每个可执行文件超过第一个文件)是为了我的编译器的利益,所以是的,我组织项目时会考虑到它们是如何构建的。我希望汉斯这样做,这就是C++中的生命。@ Steve Jessop Good点,但是多个CPP文件的另一个使用是命名空间分离。例如,防止污染可移植代码的命名空间。还有其他人类利益。有趣的讨论。@paperjam:是的,公平地说,当标题将任何内容放入全局名称空间(包括用于此目的的宏)时,就会出现这种情况,尤其是对于
windows.h
,因为它破坏了一些标准内容。所以我有点夸张,但是单独文件的组织优势可以通过单独的标题来实现。很多时候,专门使用.cpp文件而不是将几乎所有内容都粘贴在头文件中的原因是为了获得良好的增量重建。不幸的是,构建时间是一个问题。这可能是stdlib和Boost的约定,但作为一个完整的预感,我真的不确定这是否是大多数用户代码的约定,我想我们都知道我们不应该在用户代码中模仿这两个库的样式。不过,关于VC和“内部类”的要点很好。请提供您的答案。