Поскольку я перенес несколько C проектов на C ++ , прежде чем я смогу передать свой опыт:
Я предполагаю, что на самом деле вы имеете в виду «Делать классы и объекты из кода, который уже работает нормально», когда вы говорите, что переносите с C
на C++
. Это, вероятно, то, что вы делаете. Я предполагаю, что причина, по которой вы хотите сделать перенос, состоит в том, чтобы сделать код более пригодным для повторного использования и поддержки. Имейте в виду, я предполагаю, что это проект среднего и большого размера (не менее 10000 LOC).
Если это так, то я могу представить некоторые проблемы, с которыми вы столкнетесь, но это также и проблемы, которые встречаются в C ++ в целом:
Недавно внесенные ошибки при его создании
'OO'**
Поскольку C является процедурным, это будет призыв к суждению относительно того, что является «повторно используемым» в смысле объекта в C ++. Вы, вероятно, иногда обнаружите, что ваше первоначальное наблюдение было неверным. Не потому, что ваш код не компилируется, а потому, что логика не работает так, как раньше. В этом случае: тестируйте, тестируйте, тестируйте (постепенно) и выполняйте весь свой причудливый рефакторинг с шаблонами проектирования в конце, когда вы знаете, что ваши базовые объекты C ++ не искажают первоначальную предполагаемую логику программы C.
Проблемы с управлением памятью
C malloc
и free
и C ++ new
и delete
делают очень разные вещи. То, как будут распределяться ваши объекты C ++, будет во многом зависеть от того, как вы переосмыслили свое понимание того, что делает код C, и поэтому вам нужно быть очень опытным в обоих случаях. Но сначала я бы оставлял вызовы malloc и free и просто абстрагировал их с помощью C ++, если только для этого нет веских причин. Таким образом, как только ваши классы созданы и выделяют и освобождают память, ваше приложение будет иметь утечки памяти. Это гарантия и самая причина, по которой вы должны проводить тестирование постепенно.
Рефакторинг и дизайн шаблонов
Я думаю, что иногда возникает искушение сходить с ума с шаблонами наследования и проектирования, чтобы сделать код более «легким». Попробуйте противостоять этому искушению в начале порта, потому что шаблоны проектирования - это по сути способ оптимизации кода, чтобы он был более эффективным и обслуживаемым, но гораздо сложнее подумать о переносе кода C на C ++ И подумать о шаблонах проектирования И рефакторинг И «дерьмо теперь не работает» И «Я использовал неправильный шаблон проектирования, прежде чем я должен его изменить» ... Как вы можете видеть, он может очень быстро выйти из-под контроля, поэтому сосредоточьтесь на ОДНОМ деле за один раз, чтобы держите процесс переноса ошибок легким и легким, чтобы не перегружаться.
Глобал
Вам нужно будет вырезать глобалы и выяснить, где ограничить их объем. Постарайтесь сохранить значение и функции кода C, создавая по одному простые объекты C ++, не требующие ничего особенного в отношении пространств имен, наследования, шаблонов проектирования и т. Д. Опять же, кое-что, что я бы предложил сделать после преобразования вашего кода в классы. .