Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Первые опыты в C++, анализ кода  
:(
    Опции темы
archimed7592
Дата 6.11.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Код

class dbfTable
{
 public:
    dbfTable(char *tableName);
/* я бы добавил explicit к конструктору, иначе можно писать так:
    dbfTable tbl = "234.dbf"; или вообще dbfTable tbl = 0; (по смыслу бред получается)
    ещё: не char *, а const char *
*/
/*
    а где конструктор копирования, оператор присваивания?
*/
......
 private:
    dbfTableHeader itsTableHeader;
    char* itsTableName; // лучше использовать std::string - её не нужно удалять, не нужно выделять под неё память и т.д. - всё будет автоматом.
    fstream *itsTableFile; // зачем создавать поток динамически? 0_о
};

// ...
   itsTableFile = new fstream(itsTableName, ios::out | ios::binary);
   if (!itsTableFile) // не нужно ничего проверять - если new не удасться выделить память он бросит исключение.
   {
      cout << "Can\'t open file\n"; 
      return 1;
   };


Добавлено через 46 секунд
Цитата(GrayCardinal @  6.11.2007,  18:51 Найти цитируемый пост)
А передёргивать не надо  smile  

Ыыыы, где и чего я передёрнул? 0_о
С чем ты не согласен?

Добавлено через 1 минуту и 51 секунду
Цитата(tatan @  6.11.2007,  17:59 Найти цитируемый пост)
Но в предыдущей теме ктото сказал что проверка указателей на валидность почти ошибка в проектировании, все и убрал оставив на потом 

Проверка на 0 и проверка на валидность - разные вещи... smile

Добавлено через 7 минут и 7 секунд
Код

      if( s[i].FieldType != 'C' && 
          s[i].FieldType != 'N' &&
          s[i].FieldType != 'F' &&
          s[i].FieldType != 'D' &&
          s[i].FieldType != 'M' &&
          s[i].FieldType != 'L' )

Нафиг нужно было заводить константы в .hpp, когда здесь проверяешь по значению?

Добавлено через 8 минут и 59 секунд
Ааа, и ещё: С++ - не Дельфи... В С++ можно реализовывать разные ф-ции в разных файлах, т.е., можно было бы хотя бы все определения dbfTable::* вынести в отдельный файл, а ещё лучше разбить его потом на несколько файлов(разделив связанные по смыслу ф-ции).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
maxim1000
Дата 6.11.2007, 19:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(GrayCardinal @  6.11.2007,  17:51 Найти цитируемый пост)
Указатели, перед тем как их удалять лучше проверять на NULL.

delete для нулевого указателя - вполне корректная операция


--------------------
qqq
PM WWW   Вверх
GrayCardinal
Дата 6.11.2007, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

для нулевого указателя - вполне корректная операция 

И правда... Только вот с каких пор ? Точно помню что сегфолты ловил на таком  smile 



--------------------
PM MAIL WWW   Вверх
archimed7592
Дата 6.11.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(GrayCardinal @  6.11.2007,  19:16 Найти цитируемый пост)
Только вот с каких пор ?

С оч древних - ещё в first edition(2003) было. Не знаю, как в ANSI-96(или какого он там года?).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
GrayCardinal
Дата 6.11.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



archimed7592, 
maxim1000, 
А я долго не парился на эту тему smile
Код

#ifdef __cplusplus
#define DROP(arga) if (arga) { ::free (arga); arga = NULL; }
#else
#define DROP(arga) if (arga) { free (arga); arga = NULL; }
#endif


Добавлено через 1 минуту и 28 секунд
Код

С оч древних - ещё в first edition(2003) было

Так недавно ?  smile 


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 6.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(maxim1000 @  6.11.2007,  19:05 Найти цитируемый пост)
delete для нулевого указателя - вполне корректная операция


только, в частности, мелкософтский компилер тратит на "удаление" нулевого указателя гдето 11 тактов процессора вместо одной проверки, если напишешь сам


Цитата(GrayCardinal @  6.11.2007,  17:33 Найти цитируемый пост)
5. Все переменные  должны быть в начале функции.


GrayCardinal, ты когда-нить работал с большими переменными? зачем их объявлять в начале, если они по ходу дела могут не понадобиться? только время (процессорное) потратишь... или если переменная в конструкторе делает что-то немелкое по времени (к примеру, ищет сервер)


--------------------
user posted image    user posted image
PM MAIL   Вверх
tatan
Дата 6.11.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



про "Еще проще" - записал
про const - запомнил
Спасибо
PM MAIL   Вверх
GrayCardinal
Дата 6.11.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Alek86, 
Если по ходу дела могут не понадобиться - лучше делать их динамическими. А если так, в центре функции, то читабельность стремится к нулю... Суть "объявления" переменных в начале - это просто меняется цифра в одной команде. А если в конструкторе что-то делается "долго", то опять таки лучше    
динамически ...  smile

Добавлено через 2 минуты и 50 секунд
Alek86, 
О чём спорим ?  smile 

Это сообщение отредактировал(а) GrayCardinal - 6.11.2007, 19:35


--------------------
PM MAIL WWW   Вверх
Alek86
Дата 6.11.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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


Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
А если так, в центре функции, то читабельность стремится к нулю...

чувствуется закоренелый сишник. с такими сиплюсплюсникам лучше не спорить - ато опять религ. война посреди темы разгорится smile

Добавлено через 3 минуты и 40 секунд
Цитата(archimed7592 @  6.11.2007,  18:54 Найти цитируемый пост)
 В С++ можно реализовывать разные ф-ции в разных файлах,


опять левый вопрос

насколько позволительно с точки зрения "общепринятого стиля" инклудить cpp в другие cpp?
или 1 cpp <-> 1 h ?


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
Если по ходу дела могут не понадобиться - лучше делать их динамическими.

Вот даже как... 0_о


Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
. А если так, в центре функции, то читабельность стремится к нулю...

Переменная должна быть как можно ближе к месту первого использования, а ещё лучше, если это возможно обернуть место её использования в отдельный scope.
И ещё, как это читабельность может стремиться к нулю, если средний размер ф-ции 10-25 строк?
Цитата(GrayCardinal @  6.11.2007,  19:33 Найти цитируемый пост)
то опять таки лучше    
динамически ...  smile

И стражей(boost::mutex, к примеру)? Тоже динамически? А если исключение? Я вообще не помню, когда в последний раз писал delete(это я о том, что если я что-то динамически и выделяю, то есть нечто статическое(вроде shared_ptr), которое обязательно удалит это).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
tatan
Дата 6.11.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



to archimed759:
"я бы добавил explicit к конструктору" - про explicit пока ничего не знаю.Буду читать.

про копировщик и присваивание - записал, не знаю правда как это все сделать

"char* itsTableName; // лучше использовать std::string" - здесь затупил, спасибо

"fstream *itsTableFile; // зачем создавать поток динамически? 0_о" - извращение, уже понял

"if (!itsTableFile) // не нужно ничего проверять - если new не удасться выделить память он бросит исключение" - так было в книжке, 
пока не читал про exception s, наверняка можно писать свои обработчики исключений, но это впереди

"Нафиг нужно было заводить константы в .hpp, когда здесь проверяешь по значению?" - един-е объяснение - затупил

to GrayCardinal:

"А я долго не парился на эту тему smile" - пока эта конструкция с define не очень понятня, думаю разбирусь
Спасибо
PM MAIL   Вверх
archimed7592
Дата 6.11.2007, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(tatan @  6.11.2007,  19:51 Найти цитируемый пост)
пока не читал про exception s, наверняка можно писать свои обработчики исключений, но это впереди

Суть сказанного была не про исключения а про то, что new(в той форме в которой ты его написал) никогда не вернёт 0.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
tatan
Дата 6.11.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

Репутация: нет
Всего: 1



понял, и скорее всего в книжке было както так

Код

  fstream itsTableFile(itsTableName, ios::out | ios::binary);
   if (!itsTableFile)
       ....



PM MAIL   Вверх
maxim1000
Дата 6.11.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(GrayCardinal @  6.11.2007,  19:23 Найти цитируемый пост)
#define DROP(arga) if (arga) { ::free (arga); arga = NULL; }

та я про free как-то и не говорил
а в своём посте специально написал delete


--------------------
qqq
PM WWW   Вверх
archimed7592
Дата 6.11.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(maxim1000 @  6.11.2007,  22:29 Найти цитируемый пост)
та я про free как-то и не говорил

И, тем не менее, free так же ничего не сделает в случае с нулевым указателем.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.