Тонкости C/C++

Тема в разделе "LANGS.C", создана пользователем Nafanya, 5 фев 2011.

  1. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    ну во первых, я не "нагревался", а во вторых васм от этого не пострадает, так что на здоровье =)
     
  2. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Предлагаю взглянуть на улыбку Чеширского кота - прием в программировании, применяющийся для сокрытия информации из распространяемых с библиотекой h-ников. Он нацелен на то, чтобы после попадания h-ника в агрессивную среду, прикладные программисты не обращались к закрытым методам и полям через указатели.
    Предполагается,что дизасмы использоваться не будут, только уровень сишняка. Итак:
    Код (Text):
    1. //Secret.h
    2. class Secret {
    3. private:
    4.   struct Cheshire; // Class declaration only
    5.   Cheshire* smile; // Cheshire smile:)
    6. public:
    7.    Secret();
    8.   ~Secret(void){delete smile;}
    9.   int read();
    10.   void change(int);
    11. };
    12.  
    13.  
    14. //Secret.cpp
    15. #include "Secret.h"
    16. struct Secret::Cheshire {
    17.   int i;
    18.   //Other secret variables.......
    19.   void initialize_var() {i=0;}
    20.   int  read_var(){return (i);}
    21.   void set_var(int j) {i=j;}
    22.   //Other secret functions.......
    23. };
    24.  
    25. Secret::Secret()
    26. {
    27.   smile = new Cheshire;
    28.   smile->initialize_var();
    29. }
    30.  
    31. int Secret::read() {
    32.   return(smile->read_var());
    33. }
    34.  
    35. void Secret::change(int x) {
    36.      smile->set_var(x);
    37. }
    Как видно в h-нике лишь определены открытые функции-обертки и указатель на секретную структуру Cheshire (в которой определены реальные функции и поля). Реализация библиотеки распространяется в объектном файле и из исходников программисту доступен лишь h-ник. При попытки создания объекта структуры Cheshire - улыбается Чеширский кот:) (вылетит ошибка), то есть создать можно лишь указатель и прикладной программист не может получить информацию о внутренних данных и методах секретной структуры.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Nafanya
    избавьте нас пожалуйста от копирования википедии.
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Nafanya

    Интересно, что вы скажете об этом сайте и его создателях? http://www.insidecpp.ru/
     
  5. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    asd

    Ну что сказать - насчет отзыва на книгу Страуструпа частично согласен.
    Герберт Шилдт тоже пишет справочники, хоть он и не создатель языка С++, но он описывает возможности языка последовательно, интересно и главное понятно. Не знаю какую надо иметь силу воли, чтоб дочитать сухие заумные изречения Страуструпа до конца.
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    а мне нравится читать его спец издание
    язык программирования с++ > 1000 страниц
    еще дизайн и эволюция интересная
    часто заглядываеш как в справочник в них
     
  7. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    _DEN_
    кстати, когда же настанет это "скоро"?
     
  8. SilentSnowfall

    SilentSnowfall New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2011
    Сообщения:
    27
    Nafanya, вообще-то это называется pImpl. Да и вообще, смысл писать очевидные вещи, известные любому более-менее серьезному программисту C/C++. Лучше иди почитай Саттера и Мэйерса.
     
  9. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Пока тему не прикрыли, хотел бы узнать: как лучше (эффективнее) использовать fread?

    Так:
    Код (Text):
    1.     fread(&header, sizeof(BITMAPFILEHEADER), 1, stream);
    Или так:
    Код (Text):
    1.     fread(&header, 1, sizeof(BITMAPFILEHEADER), stream);
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.252
    по большому счету разницы нет... в винде лучше наверное так:
    Код (Text):
    1. fread(&header, sizeof(BITMAPFILEHEADER), 1, stream);
    так как это одна итерация ReadFile... подробности в исходниках CRT...
     
  11. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    В книге "Философия Си++" Брюса Эккеля (1-ый том 376 страница) в пункте об вложенном итераторе на мой взгляд косяк.
    Оригинал кода:
    Код (Text):
    1. bool operator++() { // Prefix
    2.     if(index >= oc.a.size()) return false;
    3.     if(oc.a[++index] == 0) return false;
    4.     return true;
    5.   }
    Если индекс в векторе равен (Size-1), где Size размер вектора, то при вызове функции инкремента код if(index >= oc.a.size()) return false; не вернет false. При выполнении следующей строки кода if(oc.a[++index] == 0) return false; налицо вылет за границы вектора!
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.252
    опять же по-моему все именно так, как и должно быть))) хотя для надежности надо было бы ставить постфиксный инкремент, чтобы уж наверняка)))

    вам наверное интересно будет прочесть:
    http://lurkmore.ru/++i_+_++i
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Rel
    Префикс и постфикс - две большие разницы. С префиксом там действительно косяк, ибо брать значение по size незя.
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.252
    блин... это шутка, вы видите много скобочек в конце предложений?)) это смайлики))) на самом деле понятно, что префиксный инкремент выполниться первым, но смотрите... это перегруженный оператор класса... реализация может быть любой... вполне возможно, что в операторе реализована проверка выхода за границу и возврат нуля в случае неудачи... то есть ++index является проверкой на следующий элемент... или вполне возможно, что итерация начинается с единицы, а не с нуля... все может быть, надо смотреть реализацию класса...
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Rel
    Одних смайликов недостаточно для шутки.

    Вот тут я вообще не понял, оператор ++ вызвать можно? Можно, и значит выйти за границы массива тоже можно.
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.252
    оператор ++ относится к индексу, мне всетки кажется, что индекс - не класс)) "все может быть" относилось к реализации oc.a и к перегрузке оператора []... давайте посмотрим на эту проблему с другой стороны... предположим, что "вектор", о котором говорится в примере (он же oc.a) - это std::vector из stl... мы делаем для него итератор... вспомним, что возвращает функция std::vector::end()... она возвращает итератор, указывающий за последний элемент вектора... то есть итератор при инкременте должен увеличивать индекс до тех пор, пока индекс не станет равным размеру... может быть с этим связано... проверка на ноль канеш выглядит довольно странно для "не строки"... а так канеш надо книгу смотреть, каждый из авторов может ошибиться... просто не надо думать, что книги пишут программисты уровня Нафани)))
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Rel
    Разыменовывать такой итератор всё равно нельзя. Однозначный фейл. И вообще итераторы здесь абсолютно не причём, их здесь просто нет, тупо обращение к элементу за границами массива.
    С другой стороны удивляться ошибкам в книгах не стоит, они очень часты.
     
  18. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Rel
    oc.a стандартный вектор.

    Выкладываю оригинал кода из книги целиком. Посмотрите как реализован итератор, там действительно вылет за границы вектора. (SmartPointer::operator++())