C++實(shí)現(xiàn)簡(jiǎn)單插件機(jī)制原理解析
在我做的第一個(gè)頁(yè)游項(xiàng)目中,服務(wù)器使用了插件的機(jī)制,但是當(dāng)時(shí)的插件都是用C#寫(xiě),而且如何實(shí)現(xiàn)的也不是很清楚。之后的幾個(gè)頁(yè)游項(xiàng)目都是自己一個(gè)人包攬服務(wù)器部分,所以一直沒(méi)有寫(xiě)插件的需求。下一個(gè)頁(yè)游項(xiàng)目服務(wù)器這邊需要多人合作,因此我想把其他模塊都獨(dú)立的做成插件的模式,目前也是在探索階段。通過(guò)網(wǎng)上資料查找以及自己的整理,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單版本的插件機(jī)制。實(shí)現(xiàn)代碼如下:
文件Object.hpp中實(shí)現(xiàn)了所有插件類(lèi)的基類(lèi),所有插件都要繼承該類(lèi)。
#ifndef __OBJECT_HPP__ #define __OBJECT_HPP__ class Object { public: Object() {} virtual ~Object() {} virtual int Dump() = 0; }; #endif //__OBJECT_HPP__
文件TestObject.hpp以及TestObject.cpp是插件的實(shí)現(xiàn)類(lèi)。
#ifndef __TESTOBJECT_HPP__ #define __TESTOBJECT_HPP__ #include "Object.hpp" class TestObject : public Object { public: virtual int Dump(); }; #endif //__TESTOBJECT_HPP__
#include "TestObject.hpp" #include <iostream> extern "C" { void *Instance() { return new TestObject; } } int TestObject::Dump() { std::cout << "class name:TestObject function name:Dump()" << std::endl; return 0; }
文件main.cpp中加載和使用了插件,如果更深入一點(diǎn)的話(huà)這里可以寫(xiě)一個(gè)插件管理的類(lèi),專(zhuān)門(mén)負(fù)責(zé)插件的注冊(cè)、對(duì)象的生成等工作。目前只為了演示功能故未做進(jìn)一步研究。
#include <dlfcn.h> #include <iostream> #include "Object.hpp" typedef Object *Instance(); int main() { void *handle = dlopen("./libto.so", RTLD_LAZY); if(!handle) { std::cout << dlerror() << std::endl; return 1; } Instance *GetInstance = (Instance *)dlsym(handle, "Instance"); if(!GetInstance) { std::cout << "Error Instance function" << std::endl; return 1; } Object *obj = GetInstance(); if(0 != obj) { obj->Dump(); } delete obj; dlclose(handle); return 0; }
最后是makefile文件。
SOURCE=TestObject.cpp makeso:${SOURCE} g++ -fPIC -shared $^ -o libto.so main: g++ -o main -ldl main.cpp clean: rm -rf main *.o *.so all:makeso main
程序的編譯方式很簡(jiǎn)單,只要make all就可以了。運(yùn)行過(guò)程如下:
[kiven@localhost plugin]$ make all g++ -fPIC -shared TestObject.cpp -o libto.so g++ -o main -ldl main.cpp [kiven@localhost plugin]$ ./main class name:TestObject function name:Dump() [kiven@localhost plugin]$
整個(gè)程序都很簡(jiǎn)單,其中Object.hpp main.cpp兩個(gè)文件是主程序,即游戲服務(wù)器的框架中要實(shí)現(xiàn)的功能。TestObject.hpp、TestObject.cpp是插件的具體實(shí)現(xiàn),可以理解為具體游戲模塊的實(shí)現(xiàn)。這里實(shí)現(xiàn)的插件機(jī)制是個(gè)雛形,只能用來(lái)演示功能,具體要用到游戲服務(wù)器中時(shí)插件還需要訪問(wèn)到主程序中的類(lèi),對(duì)象以及方法等。
到此這篇關(guān)于C++實(shí)現(xiàn)簡(jiǎn)單插件機(jī)制原理解析的文章就介紹到這了,更多相關(guān)c++插件機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
xxx_cast類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇xxx_cast類(lèi)型轉(zhuǎn)換的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C++實(shí)現(xiàn)紅黑樹(shù)核心插入實(shí)例代碼
紅黑樹(shù)是一種二叉搜索樹(shù),但在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)紅黑樹(shù)核心插入的相關(guān)資料,需要的朋友可以參考下2023-06-06詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間
這篇文章主要介紹了詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08C語(yǔ)言編程中統(tǒng)計(jì)輸入的行數(shù)以及單詞個(gè)數(shù)的方法
這篇文章主要介紹了C語(yǔ)言編程中統(tǒng)計(jì)輸入的行數(shù)以及單詞個(gè)數(shù)的方法,利用最基礎(chǔ)的循環(huán)和判斷語(yǔ)句寫(xiě)成,需要的朋友可以參考下2015-11-11C語(yǔ)言通過(guò)二分查找實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了在C語(yǔ)言中如何通過(guò)二分查找思想編寫(xiě)一個(gè)簡(jiǎn)單的猜數(shù)字游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-0215種?C++?常見(jiàn)報(bào)錯(cuò)原因分析
這篇文章主要介紹了15種?C++?常見(jiàn)報(bào)錯(cuò),本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)打印數(shù)字金字塔方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11