Как получить указатель на функцию для функции-члена класса, а затем вызвать эту функцию-член с определенным объектом?
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 библиотека и другие связанные с ней модули очень полезны.
Звучит так, будто сам рендер HTML выводит свой собственный <img>
, поэтому попробуйте просто echo $logo
, возможно?