C++ 如何划分一个超大的班级?

C++ 如何划分一个超大的班级?,c++,visual-studio-2013,C++,Visual Studio 2013,我有半打与IO相关的类,都有它们的小实用程序类等,都在1000行左右。它们都必须在一个类中,因为根类被模板化以定义地址空间和使用模式,这使得在外部使用其成员非常方便 尽管如此,它还是让我很痛苦,因为它需要太多的滚动和点击,我必须记住所有的东西都在哪里。在C++中没有一个部分类,有没有其他方法来分割这个巨大的头文件?< /p> ,可以在头文件中声明类,然后将每个定义分隔成自己的CPP文件。然后有一个主cpp文件,其中包括所有这些子cpp文件。编译时,只需引用“主”文件作为输入文件 许多模板类都是这

我有半打与IO相关的类,都有它们的小实用程序类等,都在1000行左右。它们都必须在一个类中,因为根类被模板化以定义地址空间和使用模式,这使得在外部使用其成员非常方便


尽管如此,它还是让我很痛苦,因为它需要太多的滚动和点击,我必须记住所有的东西都在哪里。在C++中没有一个部分类,有没有其他方法来分割这个巨大的头文件?< /p> ,可以在头文件中声明类,然后将每个定义分隔成自己的CPP文件。然后有一个主cpp文件,其中包括所有这些子cpp文件。编译时,只需引用“主”文件作为输入文件

许多模板类都是这样创建的。它们使用
.tcc
扩展名来标记某些功能的实现,因此它不在头文件本身中。C++不关心函数的实现,只要在编译和链接时间可以找到。因此,尽管C++本身没有<代码>部分类< /> >,但是<>代码>部分类< /代码>的功能仍然是隐式可用的。 比如说,

//BigClass.h
#pragma once
class BigClass
{
    // Lots of methods
    public:
        void doMethodA();
        void doMethodB();
        // ...
};
然后,有许多子文件实现每个文件一个方法

//BigClass_doMethodA.cc
void BigClass::doMethodA()
{
    // Method body
}
在另一个文件中,您执行相同的操作

//BigClass_doMethodB.cc
void BigClass::doMethodB()
{
    // Method body
}
然后,您有一个“主”cpp文件

//BigClass.cpp
#include "BigClass.h"
#include "BigClass_doMethodA.cc"
#include "BigClass_doMethodB.cc"

预处理器会将所有文件粘合到一个大文件中进行编译,但您不必自己这么做。

您可以在头文件中声明类,然后将每个定义分离到自己的cpp文件中。然后有一个主cpp文件,其中包括所有这些子cpp文件。编译时,只需引用“主”文件作为输入文件

许多模板类都是这样创建的。它们使用
.tcc
扩展名来标记某些功能的实现,因此它不在头文件本身中。C++不关心函数的实现,只要在编译和链接时间可以找到。因此,尽管C++本身没有<代码>部分类< /> >,但是<>代码>部分类< /代码>的功能仍然是隐式可用的。 比如说,

//BigClass.h
#pragma once
class BigClass
{
    // Lots of methods
    public:
        void doMethodA();
        void doMethodB();
        // ...
};
然后,有许多子文件实现每个文件一个方法

//BigClass_doMethodA.cc
void BigClass::doMethodA()
{
    // Method body
}
在另一个文件中,您执行相同的操作

//BigClass_doMethodB.cc
void BigClass::doMethodB()
{
    // Method body
}
然后,您有一个“主”cpp文件

//BigClass.cpp
#include "BigClass.h"
#include "BigClass_doMethodA.cc"
#include "BigClass_doMethodB.cc"

预处理器会将所有文件粘合到一个大文件中进行编译,但您不必自己这么做。如果由于模板和继承的原因而将代码拆分没有意义,那么物理拆分代码就没有意义了。它应该都在同一个文件中。IDE通常有很好的处理代码的方法。对于VS2013,可以使用折叠代码功能。如果您从以下内容开始:

您可以折叠您不需要处理的内容,并扩展您希望看到的内容:

这将使代码编辑更容易

通过以下任一方式执行此操作:

  • 手动折叠您不想看到的内容并保留您确实想要的内容。这可以通过代码部分边缘上的小+/-来完成
  • 使用查看->大纲->与定义对齐以获得单个定义,然后使用+打开正在处理的内容
    在视图->大纲菜单中还有其他有用的代码简化工具

    如果由于模板和继承的原因而拆分代码没有意义,那么物理拆分代码就没有意义。它应该都在同一个文件中。IDE通常有很好的处理代码的方法。对于VS2013,可以使用折叠代码功能。如果您从以下内容开始:

    您可以折叠您不需要处理的内容,并扩展您希望看到的内容:

    这将使代码编辑更容易

    通过以下任一方式执行此操作:

  • 手动折叠您不想看到的内容并保留您确实想要的内容。这可以通过代码部分边缘上的小+/-来完成
  • 使用查看->大纲->与定义对齐以获得单个定义,然后使用+打开正在处理的内容
    在视图->大纲菜单中还有其他有用的代码简化工具

    建议在讨论标题时不要使用“cpp文件”。有人会误解这些定义并将其放入cpp文件中,然后不得不问“为什么我不能链接?”问题。这可能更好地描述为主标题和子标题参见我给出的示例。在本例中,我的意思是“cpp文件”,但我通常不会推荐它。我的解决方案利用C/C++预处理器从一堆较小的cpp文件创建一个较大的cpp文件。从技术上讲,您可以为较小的文件使用您想要的任何文件扩展名来帮助您区分差异,甚至可以在
    #ifdef
    #endif
    指令之间包含
    #error
    指令,以确保子文件从不直接包含。如果您查看STL类,您将看到,这与他们使用的原理相同。是的,但他们不使用cpp文件。它们是具有不同名称的头文件,因此可以轻松地将它们标识为模板实现文件。它们并不像cpp文件这一术语的常用用法那样,是各自独立的实体,可以编译成目标代码。你想要的想法没有错,但选择不当的术语会扭曲你的答案,使其被解读为暗示了一些不起作用的东西。建议在讨论标题时不要使用“cpp文件”。有人会误解这些定义并将其放入cpp文件中,然后不得不问“为什么我不能链接?”问题。这可能更好地描述为主标题和子标题