代码之家  ›  专栏  ›  技术社区  ›  Andrew Garrison

一个类包含多个实现文件

  •  21
  • Andrew Garrison  · 技术社区  · 16 年前

    例如:

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

    福。Read.cpp

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

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

    #include "Foo.h"
    void Foo::Run()
    {
    }
    
    7 回复  |  直到 16 年前
        1
  •  17
  •   Gunther Piez    16 年前

    这很好。最终,一切都会联系在一起。

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

        2
  •  6
  •   Malkocoglu    16 年前

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

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

    您还可以隐藏某些函数的实现细节。两个人可能在不了解彼此的情况下实现一个类的某些部分。便于国防部项目。

        3
  •  4
  •   fbrereto    16 年前

    不,它在技术上没有任何问题。链接器将把Foo的所有部分整合到最终的二进制文件中。

        4
  •  2
  •   Max Lybbert    16 年前

    我一直在使用Apache Portable Runtime,它几乎做了这件事。你有一个标题,比如说 apr_client.h 以及该标头中函数的多个实现文件——每个文件代表客户端操作的一个方面。这并没有错,也并不罕见。

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

    C++不是Java,所以你不必根据类名来选择文件名。

        5
  •  2
  •   Daniel Rodriguez    16 年前

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

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

        6
  •  0
  •   nagates    16 年前

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

        7
  •  0
  •   Richard Corden    16 年前

    有两点可能值得考虑。

    全类优化:

    如果编译器在解析文件时拥有所有可见的成员函数(假设只有一个TU编译器),那么它可能能够在不同的成员函数之间进行优化。

    代码审查

    如果一个类的所有定义都在同一个TU中,那么这使得手动代码审查更容易。如果将定义拆分为不同的TU,这将大大增加手动审查所需的工作量,因为需要搜索相应的文件,并在窗口之间不断切换以获得“整体”画面。