На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Переносимость кода , опять Дельфи со своими заморочками ...
    Хочется "перенести" еще чуток кода с Дельфи в портируемый С++...

    Вопрос №1: Что делать с объявлениями такого вот типа

    SomeMethod = function(P: Pointer): Boolean of object;


    Пытаюсь нечто подобное найти в стандартном C++:

    class SomeClass;
    typedef bool (SomeClass::* SomeMethod)(void*);


    Но, мне кажется, это не совсем то! В первом случае, в Дельфи, можно переменную такого вот типа SomeMethod инициализировать любыми методами (конечно сходного формата объявления) любого класса.

    В случае же C++, для инициализации нельзя использовать функциb разных классов если классы не имеют общего предка с SomeClass? Или я ошибаюсь?

    Вопрос №2: Callback функции

    В некоторых обсуждениях я встречал мнения, что "грамотнее" передачу обобщенных действий делать в виде callback-функций, нежели переинициализацией указателя на функцию класса. Ну первое - не совсем понятен механизм как такое можно сделать. А второе - а как же "законченность" функциональности класса?

    Хелп, плиз! У кого какие соображения по поводу всего этого? Может какие примерчики есть грамотные? unsure.gif
    Сообщение отредактировано: JoeUser -
      1) можно использовать функции разных классов. только нужно помнить, ччто у фукнции класса первый аргумент, коорый не пишется но подразумевается - указатель на класс. пресловутый this.
      2) не совсем понял.
      callback фукнция - это самая обычная фукнция, адрес которой дают другой фукнции.

      ЗЫ в C# есть специальная фигня, называется delegate.
        Ну а на с++ эти делегаты реализуються с пощью шаблонов.
          Цитата
          JoeUser, 12.12.03, 11:44
          В случае же C++, для инициализации нельзя использовать функциb разных классов если классы не имеют общего предка с SomeClass? Или я ошибаюсь?


          Да это так. На самом деле и в Делфи можно сказать почти так же, так как в Делфи все классы наследуются от TObject.
            Цитата (Fantasist @ 12.12.03, 20:45)
            Да это так. На самом деле и в Делфи можно сказать почти так же, так как в Делфи все классы наследуются от TObject.

            Все оказалось гораздо хуже mad.gif

            Не зря таки придумали господа из Борланда описатель __closure для своего ЦБилдера. Именно он полностью заменяет Дельфевый тру-ля-ля of object.

            Разница такова: переменная of object инициализируется функцией экземпляра класса, а то, что я приводил из стандартного С++, функцией класса. Однако самое неприятное, что при описании типа


            class SomeClass;
            typedef bool (SomeClass::* SomeMethod)(void*);


            Переменную типа SomeMethod я смогу проинациализировать только теми функциями класса, которые были в SomeClass! Иными словами, если я наследую от SomeClass другой класс и в нем определю новые функции, то ими я не могу проинициализировать переменную типа SomeMethod. Вот мля!

            Пример:


            class A;
            typedef void (A::* SomeMethod)();

            class A {
             public:
             void FuncA(){};
            };

            class B: public A  {
             public:
             void FuncB(){};
            };

            int main(int argc, char* argv[]) {
            SomeMethod M;

            //  следующее компайлер "съедает"
            M = &B::FuncA;

            //  на следующем ошибка компиляции:
            //  Cannot convert 'void(B::*)()' to 'void(A::*)()'
            M = &B::FuncB;

             ...


            mad.gif
            Сообщение отредактировано: JoeUser -
              Используй статические функции с первым параметром - указателем на объект. Имеено так фактически и реализуются подобные вещи.
              Delphi'йские class method - это фактически структура из двух указателей - указатель на метод и указатель на объект класса.
                В качестве варианта - попробуй boost::signal и boost::connection (http://www.boost.org)
                  Цитата (Flex_Ferrum @ 15.12.03, 10:32)
                  В качестве варианта - попробуй boost::signal и boost::connection (http://www.boost.org)

                  Посмотрел. Спасибо. Ну уж больно это громоздко, а получается всего лишь "прокладка" между обычным классом и "событием", реализуемым вне класса обычной функцией. Я уже смирился wink.gif и вместо ссылки на метод, использую ссылку на функцию с передачей указателя на экземпляр класса. Немного некрасиво, но работает.

                  Кстати почитал еще программерских форумов - там уж столько перемолото. Но все сходятся к отдному - в дополнение к классу писать функции-события отдельно, не как функции-класса.

                  Ну ладо, думаю вопрос закрыт.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0309 ]   [ 16 queries used ]   [ Generated: 3.05.24, 07:28 GMT ]