#cpp #стиль
Возможно, некоторые помнят мой вопрос-просьбу сделать ревизию кода по заданноу тех. заданию. Собственно, код весьма справедливо раскритиковали, назвали его плохой смесью Си с Си++, что код обладает плохой структурированностью и т.д. и т.п. Я со всем этим согласен. Но у меня возникает справедливый вопрос, о том, собственно говоря, как же избегать кода Си в программах на С++, ведь, полностью от кода Си, по-сути, избавиться то невозможно. Ведь все равно так или иначе нужны будут функции из стандартной библиотеки Си, вроде тех же memcpy или strncpy, указатели на буферы из чаров (хотя все это дело можно и даже нужно инкапсулировать в класс строк), и т.п. и т.д. В принципе, после чтения Прата, уже сложились кое-какие (весьма скромные) представления о том, как же все-таки должен выглядеть код на C++, но тем не менее. Например, мне нужно скопировать один кусок памяти в другую область памяти. Писать для этого отдельный класс, а-ля CopyFactory, который будут хранить указатели на все нужные буферы, определять все необходимые конструкторы и операции, конструктор копирования и оператор присваивания, либо же, для экономии времени, все-таки достаточно будет какого-нибудь smart_ptr с memcpy? Понимаю что все это относится больше к стилю кода, и каждый пишет програмы по-разному, но тем не менее, есть же наверняка какие-то стандарты либо правила?
Ответы
Ответ 1
Если сильно нужны именно Сишные функции — используйте. Только не подключайте Сишные заголовочные файлы, используйте стандартные обертки для них (вместо math.h, например cmath) для более корректной совместимости с C++; если это нестандартные Сишные функции — оберните сами их в extern "C". Если неясно зачем всё это — попробуйте собрать такой код: #include#include #include using namespace std; int main() { float a = 1.2; cout << abs(a) << endl; return 0; } Затем тоже самое, но с заменой первых двух строчек на следующее: #include #include и разберитесь почему поведение программ разное. Ответ 2
Например, мне нужно скопировать один кусок памяти в другую область памяти Не работайте с памятью как с "памятью", работайте с ней как с набором элементов. Элементы эти помещайте в контейнер, у контейнера вызывайте операции копирования. Дальше это уже дело контейнера как их копировать - через memcpy как POD типы или через операции копирования в противном случае.Ответ 3
При хорошем стиле можно почти полностью избавиться от любых проявлений C: не работать с памятью напрямую, использовать интеллктуальные указатели. А если вам нужно получить доступ к памяти напрямую, то, ИМХО, лучше написать класс-помощник, чтобы не жалеть потом о времени, потраченном на отладку. В частности, использование char*, как нечто большее, чем временный буфер для API функций и др., нехорошо, т.к. есть переносимый класс string, являющийся частью Стандарта.Ответ 4
Хочу примеров. В остальном, как правильно заметили остальные отвечающие, у ТС проблемы с переходом от одной модели программирования к другой. Я лично не понимаю зачем использовать ф-ции strcpy и пр., если можно использовать прекрасный тип std::string. Безопасно и надежно. При необходимости std::string всегда можно сконвертировать к "старым добрым" Сишным строкам, а потом наоборот из Сишной строки его сконструировать. Единственное, что вызовы старого API будут обрамлены жутковато выглядящим кодом преобразования. Но что поделать? Касательно работы с памятью - вообще не понял зачем она тут нужна.
Комментариев нет:
Отправить комментарий