Отправляет email-рассылки с помощью сервиса Sendsay

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск № 21


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск      : 21
Подписчиков : 1529
Cайт        : SoftMaker.com.ru
Архив       : C/C++ Вопрос-Ответ (архив)
В этом выпуске
От ведущего

Здравствуйте уважаемые подписчики !

Как всегда, рад приветствовть вас на страницах этой рассылки.
Напоминаю, что, как обычно, вы можете отправить свои пожелания (замечания, предложения, сообщения об ошибках) по поводу рассылки и сайта по этому адресу.
Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

И, как всегда, вы можете задать свои вопросы по программированию на сайте в форуме.
Или обсудить их в дискуссионном листе "Программирование. форум !!!".

Многим может быть также интересна рассылка: Visual С++ - расширенное программирование, где можно прочитать описания нестандартных приемов программирования с помощъю библиотеки MFC - 'трюков', 'хаков', недокументированных функций.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

Для того, чтобы задать свой вопрос, пришлите письмо, кликнув по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.

Небольшое примечание. Господа, если Вы хотите, чтобы Ваш e-mail был опубликован в рассылке, специально и явно укажите это в письме. Иначе e-mail адреса, указанные в теле Вашего письма в рассылке опубликованы не будут.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 84 ( Lenin )

здравствуйте
у меня возник такой вопрос:
как произвести поиск файла в текущей папке.
когда я пишу _findfirst("*.*",0) windows при запуске программы ругается,
что память не может быть written.В чем ошибка или скажите, может есть
какая другая функция

Ответить на вопрос

Вопрос № 85 ( Алексей Лебедев )

У меня к вам вопрос. Как добавить иконки в список. То есть, я создаю список:

if (!m_wndIBTree.Create(WS_CHILD|WS_VISIBLE|
           TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT,
           CRect(0, 0, 0, 0), &m_wndInstantBar, 100))
   {
       TRACE0("Failed to create instant bar child\n");
       return -1;              // fail to create
   }
   m_wndIBTree.ModifyStyleEx(0, WS_EX_CLIENTEDGE);
        
   // bring the tooltips to front
   CWnd* pTT = FromHandle((HWND)
                   m_wndIBTree.SendMessage(TVM_GETTOOLTIPS));
   if (pTT != NULL)
       pTT->SetWindowPos(&wndTopMost, 0, 0, 0, 0,
       SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);

Мне необходимо добавить в этот список к каждому его элименту иконку (картинку в формате bmp). Вот такой вопрос.

Ответить на вопрос

Вопрос № 86 ( Aleksandr Zakharov )

Здравствуйте,

стоит задача разработать утилиту для изменения и добавления текстовых ресурсов в ресурсном DLL. Подскажите пожалуйста, существует ли решение такой задачи, на уровне администратора приложения, без перекомпиляции библиотеки? Я ищу решение без использования .NET-технологий. Таково требование :)

Заранее благодарен за ответ или ссылки на решение проблемы. Может быть есть примеры реализации.

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 81 ( fox007 )

Здравствуйте!
Я только начинаю заниматься программированием на VC.
Разбирался со следующим примером:

#include <mem.h>
class Cthat
{
public:
        void doIt(void){return;};
};

class CPthat
{
private:
        Cthat* aThat;
public:
        CPthat(Cthat* _that=NULL):aThat(_that){};
        ~CPthat(){ if (aThat) delete aThat;};
        operator Cthat* (){return aThat;};
                          // Оператор преобразования типа
        CThat* operator->() {return aThat;};
                          // Оператор селектора ->
};

int main ()
{
        CPthat pthat(new Cthat);
        pthat->doIt();
                  // Вариант обращения через ->
        ((Cthat*)pthat)->doIt ();
                  //Вариант обращения через Cthat*
        delete aThat;
        return 0;
}

Пробовал, все работает. Но может кто-то объяснит как в случае
такого обращения (pthat->doIt()) происходит вызов метода класса
Cthat. Ведь после pthat-> мы получаем указатель на объект класса
Cthat, и вроде как надо бы так: (pthat->)->doIt().

Заранее благодарю за ответ.

Ответ ( Lexxa )

В случае с оператором -> компилятор обращается к возвращаемому
оператором объекту с целью найти оператор -> у него и, если нашел,
выполняет его. И т.д. рекурсивно

Ответ ( Шматко А.А. )

Это не совсем так. Дело в том, что operator-> довольно особенный. Он (если
присмотреться к синтаксису (например, как у тебя - pthat->doIt() ) бинарный,
но вторым операндом является элемент класса, структуры или объединения,
который может иметь произвольный тип, лишь бы присутствовал в этом самом
классе или в чём там ещё. Понятно, что при перегрузке этого оператора (у
тебя CPthat::operator->() ) этот второй параметр не укажешь, как параметр
оператора/функции, ибо для параметров необходимо указывать точные типы.
Поэтому авторы языка C++ определили перегрузку этого оператора как унарного,
которому передаётся только один параметр, который находится (синтаксически)
слева от него, и который должен вернуть указатель или ссылку на сущность, к
которой можно было бы применить operator* или operator->. В результате такой
перегруженный operator-> делает только половину работы - разыменовывает
левый операнд. А компилятор по прежнему сам выполняет вторую половину -
применяет к разыменованной сущности правый операнд.
У тебя CPthat::operator->() возвращает указатель на класс. Следовательно
применение к нему правого оператора можно записать как (
*(pthat->()) ).doIt() Если сократить, то получится (pthat->())->doIt(). Это
то, что ты и предположил. Но, учитывая, что второе разыменование осуществяет
сам компилятор, то его писать не нужно. Вот и получается только
pthat->doIt().
А теперь самое интересное. Если бы у тебя класс Cthat тоже бы имел
перегруженный operator->, то компилятор не остановился бы на его (втором уже
по счёту) вызове и снова бы применил к нему вторую стадию разыменования. И
так далее. Фактически, написав единственный someClass->someMember,
компилятор может сгенерировать множество вызовов перегруженных operator->.
Пока очередной элемент в цепочке возвращает в качестве сущности не простой
указатель на данные, а указатель или ссылку на класс, у которого имеется
свой перегруженный operator->, цепочка не прерывается.
Вот такой вот operator->()

Ответ ( Novikov Alexander )

Hello,

Конструкция ->, если она явно не переопределена, - возвращает указатель
того типа, к которому применяется операция (это, надеюсь, очевидно).
Т.е. неявно, в каждом классе присутствует следуюющее определение:

  class A
  {
    A* operator->() { return this ;}

  };

В результате конструкция вида pthat->doIt() делится на две части:

а) ptr_value = (*pthat).operator->()
б) ptr_value->doIt()

Т.е. "распакованный" вариант вызова выглядит так:

( (*pthat).operator->() )->doIt();
Вопрос № 82 ( Aury )

Я начинающий в C++. И мой вопрос наверно прозвучит не ново. Однако хотелось бы услышать что все таки думают по этому поводу опытные люди.
Мой вопрос такой. Какие книги вы бы посоветовали читать ив какой последовательности, чтобы наиболее быстро и полно освоить как сам язык C++, так и приемы программирования вообще. То есть как надо учиться.

Было бы здорово, если бы кто нибудь подкинул ссылочек на электронные варианты книг. И хотелось бы аргументации в плане почему именно такие то книги надо читать первыми, почему именно они считаются лучшими.

Всем заранее большое спасибо !.

Ответ ( Зарецкий Николай )

Рекомендую сходить по этой ссылке http://russianenterprisesolutions.com/sbo/ Сдесь реально помогут научиться пограммировать.
Вопрос № 83 ( surf3267 )

Hello, All !

Не подскаже те ли как лучше всего организовать в своей проге просмотр
Jpeg файлов ? Нет ли каких средств, специально для этого ?
И еще - если писать просмотрщик картинок, то на чем лучше это делать ?
На Visual C или на Buildere ?

Ответ ( 3V )

Если прога должна работать под Win98 и выше, то можно воспользоваться OLE API для растеризации JPG-ов (см. OleLoadPicture, OleLoadPictureEx, кстати, вот статья и готовые исходники: функции для загрузки изображений форматов GIF, Jpeg, EM ) в DDB, или пользоваться IPicture. Можно использовать сторонние библиотеки типа LibJpeg.
Книги по C/C++
Объектно-ориентированное программирование в C++ | (Object-Oriented Programming in C++)
Объектно-ориентированное программирование в C++ | (Object-Oriented Programming in C++)

Автор: Р. Лафоре

Благодаря этой книге тысячи пользователей овладели технологией объектно-ориентированного программирования в C++.

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

Читатель может вообще не иметь представления о C++. Необходимо лишь знание начальных основ программирования.

Страница книги на Озоне
C/C++. Справочник программиста | (C/C++ Programmer
C/C++. Справочник программиста | (C/C++ Programmer's Reference)

Автор: Герберт Шилдт

В этом компактном справочнике описаны основные синтаксические элементы программирования на языках C и C++: ключевые слова, операторы, директивы препроцессора, библиотеки функций и классов, а также дополнительные ключевые слова, используемые при программировании в среде .NET Framework.

Представленная здесь информация снабжена четкими ссылками на принадлежность к версиям C89, C99 или действующему стандарту C++.

Автор справочника - общепризнанный авторитет в области программирования на языках C и C++, Java и C# - включил в книгу советы программистам, которые позволят повысить эффективность их работы.

Страница книги на Озоне
Всего доброго. До встречи в следующем номере.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Отписаться

В избранное