一个类有多个实现文件

时间:2009-10-16 15:16:11

标签: c++ gcc

在多个源文件上实现单个类(一个.h)有什么问题吗?我意识到这可能是单个类中代码太多的症状,但是它在技术上有什么问题吗?

例如:

foo.h中

class Foo
{
   void Read();
   void Write();
   void Run();
}

Foo.Read.cpp

#include "Foo.h"
void Foo::Read()
{
}

Foo.Write.cpp

#include "Foo.h"
void Foo::Write()
{
}

Foo.Run.cpp

#include "Foo.h"
void Foo::Run()
{
}

7 个答案:

答案 0 :(得分:15)

这很好。最后,它将全部链接在一起。

我甚至看过代码,其中每个成员函数都在不同的* .cpp文件中。

答案 1 :(得分:6)

这是合法的,它有一些(!?)优势......

如果将可执行文件与此类的静态库链接,则只会使用已使用的函数。这对于有限资源的系统非常方便。

您还可以隐藏某些功能的实现细节。两个人可能在不知道彼此的情况下实现类的一部分。方便国防部项目。

如果您查看任何CRT来源,您将看到相同的模式...

答案 2 :(得分:4)

不,技术上没有任何错误。链接器将把Foo的所有部分放在最终的二进制文件中。

答案 3 :(得分:2)

我一直在使用Apache Portable Runtime,它完全可以做到这一点。你有一个标题,比如apr_client.h和该标题中函数的多个实现文件 - 每个文件代表客户端操作的一个方面。这没错,而且并不是很不寻常。

  

这可能是单个类中代码太多的症状

C ++不是Java,因此您不必根据类名选择文件名。

答案 4 :(得分:2)

完全有效。所有cpp文件都将链接在一起。

正如你所说,这对于使一个非常大的实现文件更具可读性非常有用,因为每个cpp文件都是一个编译单元,你可以(ab)使用这个事实。 (例如,未命名的命名空间)

答案 5 :(得分:0)

是的,这是合法的,事实上像C#这样的新语言一直都是这样做的。

答案 6 :(得分:0)

有两点可能值得考虑。

全班优化:

如果编译器在解析文件时(假设单个TU编译器)可以看到所有成员函数,那么它可以在不同的成员函数之间执行优化。

代码审核

如果一个类的所有定义都在同一个TU中,那么这使得手动代码检查更容易。如果定义被分成不同的TU,这显着增加了手动审查所需的工作量,因为需要搜索适当的文件,在窗口之间不断点击以获得“整个”图片。