URL-адрес Pods Framework с дополнительным http

Как получить указатель на функцию для функции-члена класса, а затем вызвать эту функцию-член с определенным объектом?

blockquote>

Легче всего начать с typedef , Для функции-члена вы добавляете имя класса в объявление типа:

typedef void(Dog::*BarkFunction)(void);

Затем, чтобы вызвать метод, вы используете оператор ->*:

(pDog->*pBark)();

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

blockquote>

Не думаю, что вы можете работать с такими конструкторами, как ctors и dtors. Обычный способ достижения такого рода вещей - использовать фабричный метод, который в основном представляет собой статическую функцию, которая вызывает конструктор для вас. Для примера см. Приведенный ниже код.

Я изменил ваш код, чтобы в основном описать то, что вы описали. Ниже приведены некоторые оговорки.

#include 

class Animal
{
public:

    typedef Animal*(*NewAnimalFunction)(void);

    virtual void makeNoise()
    {
        std::cout << "M00f!" << std::endl;
    }
};

class Dog : public Animal
{
public:

    typedef void(Dog::*BarkFunction)(void);

    typedef Dog*(*NewDogFunction)(void);

    Dog () {}

    static Dog* newDog()
    {
        return new Dog;
    }

    virtual void makeNoise ()
    {
        std::cout << "Woof!" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    // Call member function via method pointer
    Dog* pDog = new Dog ();
    Dog::BarkFunction pBark = &Dog::makeNoise;

    (pDog->*pBark)();

    // Construct instance via factory method
    Dog::NewDogFunction pNew = &Dog::newDog;

    Animal* pAnimal = (*pNew)();

    pAnimal->makeNoise();

    return 0;
}

Теперь, хотя вы обычно можете использовать Dog* вместо Animal* благодаря магии полиморфизма, тип указателя функции делает не следуют правилам поиска иерархии классов. Таким образом, указатель метода Animal несовместим с указателем метода Dog, другими словами, вы не можете назначить Dog* (*)() переменной типа Animal* (*)().

Статический метод newDog является простой пример фабрики, который просто создает и возвращает новые экземпляры. Будучи статической функцией, она имеет регулярный typedef (без классификатора классов).

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

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

0
задан Scott Kingsley Clark 19 January 2019 в 04:39
поделиться

1 ответ

Звучит так, будто сам рендер HTML выводит свой собственный <img>, поэтому попробуйте просто echo $logo, возможно?

0
ответ дан Scott Kingsley Clark 19 January 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: