2016-02-16 3 views
1

У меня есть полдюжины классов, связанных с IO, все с их небольшими полезными классами и т. Д., Все взвешиваются на ~ 1000 строк. Все они должны быть в одном классе вместе, потому что корневой класс шаблонизирован для определения адресного пространства и режима использования, что делает его очень удобным для использования его членов вне.Как разделить очень большой класс?

Его боль, чтобы воздействовать на него, хотя, так как требуется столько прокрутки и щелчка, и я должен помнить, где все. Afaik нет такой вещи, как частичный класс в C++, есть ли другой способ разбить этот огромный заголовочный файл?

+0

Разве это облегчит вашу проблему для использования классов 'friend'? Вы можете разделить код на столько «дружеских» классов, сколько вам нужно, и эти классы все равно будут иметь доступ к внутренним элементам основного класса. И хотя вы будете использовать несколько классов, это будет похоже на один «концептуальный» класс. –

+1

Поскольку не ясно, как разбить его, не будет очевидно, как его использовать. Получить большой экран;) – BitWhistler

+0

В визуальной студии 2013 вы можете свернуть раздел кода. Свернуть все и только открыть то, над чем вы работаете. –

ответ

0

Вы можете объявить класс в файле заголовка и затем разделить каждое из определений на свой собственный файл cpp. Затем у вас есть один главный файл cpp, который включает все эти файлы sub-cpp. При компиляции вы просто ссылаетесь на «главный» файл как на входной файл.

Многие шаблоны шаблонов создаются таким образом. Они используют расширение .tcc, чтобы отметить реализацию определенных функций, поэтому он не находится в самом файле заголовка. C++ не волнует, где реализована функциональность, если она может быть найдена во время компиляции и компоновки. Итак, хотя C++ не имеет partial classes как таковой, функциональность partial class по-прежнему неявно доступна.

Например,

//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" 

Препроцессор склеит все файлы в один большой файл для компиляции, но вы будете иметь преимущество, не имея сделать это самостоятельно.

+1

Рекомендуем не использовать «файл cpp» при обсуждении заголовков. Кто-то неправильно интерпретирует и помещает определения в файл cpp, а затем спрашивает: «Почему я не могу связать?» вопрос. Это, вероятно, лучше описано как главный заголовок и подзаголовки – user4581301

+0

См. Пример, который я даю. В данном случае я имею в виду «cpp-файл», но это не то, что я обычно рекомендую. Мое решение использует препроцессор C/C++ для создания одного большого файла cpp из группы меньших. Технически вы можете использовать любое расширение файла, которое вы хотите для меньших файлов, чтобы помочь вам различить разницу и даже включить директиву '# error' между директивами' # ifdef' и '# endif', чтобы убедиться, что суби файлы никогда включен непосредственно. – callyalater

+0

Если вы когда-либо смотрите на классы STL, вы увидите, что это тот же принцип, который они используют. – callyalater

1

Если нет смысла разбить код из-за шаблонов и причин наследования, тогда нет смысла физически разбить код. Он должен все быть в том же файле. У IDE обычно есть хорошие способы работы с кодом gratuitis. Для VS2013 вы можете использовать функцию коллапса. Если вы начинаете с этим:

enter image description here

Вы можете свернуть вещи, которые вы не должны работать и расширять то, что вы хотите увидеть:

enter image description here

Это сделает редактирование кода Полегче.

ли это либо:

  1. Сворачивание вещи, которые вы не хотите видеть вручную и держать вещи, которые вы хотите. Это можно сделать с помощью маленького +/- на краю секций кода.
  2. Используйте View-> Outlining-> Colapse to Definition, чтобы получить отдельные определения, а затем используйте +, чтобы открыть то, над чем вы работаете.

Есть и другие полезный код упрощающих инструментов в View-> Излагая меню.

+0

«Все должно быть в одном файле». - Это очень странно, что слышать. Обычно люди выступают за то, чтобы разделить вещи до нелепой степени, до такой степени, что вы не можете определить, какой файл/класс/функция можно найти. – immibis

+1

Я смотрю на нее так же, как и написание абзаца. Приговор - это мысль. Абзац - это набор связанных мыслей, поддерживающих идею. Когда идея меняется, абзац меняется. Иногда вы получаете очень длинные абзацы. Беспокойство о длинных абзацах (и файлах) заключается в том, что он обычно представляет: плохо продуманный, растягивающий mish-mash. Этого следует избегать. Измельчение материала волей-неволей в соответствии с требованиями максимального размера приведет к меньшей читаемости и, возможно, более хрупкому дизайну. – user4581301

+0

@immibis Возможно, это поможет, если это поможет. Но я нахожу вещи, связанные с классом A, все должны быть в A.cpp. Я мог бы поместить их в A_input.cpp и A_output.cpp, если это помогло, и, возможно, это того стоило. Но я хочу, чтобы иметь возможность взглянуть на A.h найти мое объявление функции, затем переключиться на A.cpp и найти определения функций там. Это вдвойне верно для шаблонов, все должно быть в файле 'h', который не растягивается на несколько. –

Смежные вопросы