Один класс с несколькими файлами реализации

Вы могли использовать git-svn, чтобы импортировать репозиторий в репозиторий Мерзавца, затем использовать git log -p filename. Это показывает каждую запись в журнале для файла, сопровождаемого соответствием, различным

15
задан Andrew Garrison 16 October 2009 в 15:16
поделиться

7 ответов

Это нормально. В конце концов, все будет связано вместе.

Я даже видел код, в котором каждая функция-член находилась в отдельном файле * .cpp.

16
ответ дан 1 December 2019 в 02:10
поделиться

Я работал с Apache Portable Runtime, которая в значительной степени делает именно это. У вас есть заголовок, скажем apr_client.h , и несколько файлов реализации для функций в этом заголовке - каждый файл представляет один аспект клиентских операций. В этом нет ничего плохого, и в этом нет ничего необычного.

это может быть признаком слишком большого количества кода в одном классе

C ++ не является Java, поэтому вам не нужно выбирать имена файлов в соответствии с именами ваших классов .

2
ответ дан 1 December 2019 в 02:10
поделиться

Это совершенно верно. Все файлы cpp будут связаны вместе.

Это может быть полезно, как вы сказали, для того, чтобы сделать очень большой файл реализации более читабельным, и, поскольку каждый файл cpp является единицей компиляции, вы можете (ab) использовать этот факт. (Например, безымянные пространства имен)

2
ответ дан 1 December 2019 в 02:10
поделиться

Нет, технически в этом нет ничего плохого. Компоновщик объединит все части Foo в окончательный двоичный файл.

4
ответ дан 1 December 2019 в 02:10
поделиться

Переносного способа нет. Однако есть несколько непереносимых решений.

Во-первых, как уже упоминалось другими, Windows предоставляет нестандартные __ try и __ за исключением фреймворка, называемого Structured Exeption Handling ( ваш конкретный ответ находится в базе знаний).

Во-вторых, alloca - при правильной реализации - может сказать вам, собирается ли стек переполниться:

bool probe_stack(size_t needed_stack_frame_size)
{
    return NULL != alloca(needed_stack_frame_size);
};

I как и этот подход, потому что в конце probe_stack выделенная память alloca освобождается и становится доступной для вашего использования. К сожалению, только несколько операционных систем правильно реализуют alloca . alloca никогда не возвращает NULL в большинстве операционных систем, позволяя вам обнаружить, что стек переполнен, и произошел впечатляющий сбой.

В-третьих, UNIX-подобные системы часто имеют заголовок под названием ucontext.h с функциями для установки размера стека (или, фактически, соединить несколько стопок вместе). Вы можете отслеживать, где вы находитесь в стеке, и определять, не произойдет ли переполнение. Windows имеет аналогичные возможности а-ля CreateFiber .


Начиная с Windows 8, Windows имеет функцию специально для этого ( GetCurrentThreadStackLimits )

re собирается переполниться. Windows имеет аналогичные возможности а-ля CreateFiber .


Начиная с Windows 8, Windows имеет функцию специально для этого ( GetCurrentThreadStackLimits )

re собирается переполниться. Windows имеет аналогичные возможности а-ля CreateFiber .


Начиная с Windows 8, Windows имеет функцию специально для этого ( GetCurrentThreadStackLimits )

будут входить только используемые функции. Это очень удобно для систем с ограниченными ресурсами.

Вы также можете скрыть детали реализации определенных функций. Два человека могут реализовывать части класса, не зная друг о друге. Удобно для проектов Министерства обороны США.

Если вы посмотрите на любой источник CRT, вы увидите тот же образец ...

6
ответ дан 1 December 2019 в 02:10
поделиться

да, это законно, и на самом деле новые языки, такие как C #, делают такие вещи все время.

0
ответ дан 1 December 2019 в 02:10
поделиться

Есть два момента, которые стоит рассмотреть.

Оптимизация для всего класса:

Если компилятор имеет все функции-члены, видимые ему при синтаксическом анализе файла (при условии, что один компилятор TU), то он может быть в состоянии выполнять оптимизацию между различными функциями-членами.

Code Review

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

0
ответ дан 1 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: