c++鎬庝箞瀹炵幇鍙嶅皠鏈哄埗
鍦–++涓紝娌℃湁鍐呯疆鐨勫弽灏勬満鍒躲€備絾鏄綘鍙互浣跨敤涓€浜涙妧宸ф潵妯℃嫙鍙嶅皠鐨勫姛鑳姐€?/p>
涓€绉嶅父瑙佺殑鏂规硶鏄娇鐢ㄥ畯鏉ュ畾涔夊拰娉ㄥ唽绫荤殑鍏冩暟鎹€備綘鍙互涓烘瘡涓被瀹氫箟涓€涓畯锛屽湪鍏朵腑娉ㄥ唽绫荤殑鍚嶇О鍜屾垚鍛樺彉閲忋€佹垚鍛樺嚱鏁扮瓑淇℃伅銆傜劧鍚庯紝閫氳繃瑙f瀽杩欎簺瀹忥紝浣犲彲浠ュ疄鐜扮被浼间簬鍙嶅皠鐨勫姛鑳姐€?/p>
浠ヤ笅鏄竴涓ず渚嬩唬鐮侊紝婕旂ず浜嗗浣曚娇鐢ㄥ畯鏉ユ敞鍐岀被鐨勫厓鏁版嵁锛?/p>
#include <iostream>
#include <string>
#include <map>
#define REGISTER_CLASS(classname) \
class classname##Class { \
public: \
classname##Class(const std::string& name) { \
ClassRegistry::getInstance().registerClass(name, this); \
} \
}; \
classname##Class classname##Instance(#classname);
class ClassRegistry {
public:
static ClassRegistry& getInstance() {
static ClassRegistry instance;
return instance;
}
void registerClass(const std::string& name, void* classInstance) {
classes[name] = classInstance;
}
void* getClass(const std::string& name) {
if (classes.find(name) != classes.end()) {
return classes[name];
}
return nullptr;
}
private:
std::map<std::string, void*> classes;
};
// 瀹氫箟涓€涓被
class MyClass {
public:
MyClass() {
value = 0;
}
void setValue(int newValue) {
value = newValue;
}
int getValue() const {
return value;
}
private:
int value;
};
// 娉ㄥ唽绫荤殑鍏冩暟鎹?/span>
REGISTER_CLASS(MyClass)
int main() {
// 鑾峰彇绫荤殑鍏冩暟鎹苟鍒涘缓瀹炰緥
MyClass* myObj = static_cast<MyClass*>(ClassRegistry::getInstance().getClass("MyClass"));
if (myObj) {
myObj->setValue(42);
std::cout << myObj->getValue() << std::endl;
}
return 0;
}
鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑瀹氫箟浜嗕竴涓?code>REGISTER_CLASS瀹忥紝瀹冧负姣忎釜绫荤敓鎴愪竴涓被闈欐€佸疄渚嬶紝骞跺湪鏋勯€犲嚱鏁颁腑娉ㄥ唽绫荤殑鍚嶇О鍜屽疄渚嬨€傛垜浠繕瀹氫箟浜嗕竴涓?code>ClassRegistry绫伙紝鐢ㄦ潵瀛樺偍鎵€鏈夊凡娉ㄥ唽鐨勭被鐨勫厓鏁版嵁銆?/p>
鍦?code>main鍑芥暟涓紝鎴戜滑閫氳繃璋冪敤ClassRegistry::getInstance().getClass("MyClass")
鑾峰彇MyClass
鐨勫厓鏁版嵁锛屽苟灏嗗叾杞崲涓?code>MyClass*绫诲瀷鎸囬拡銆傜劧鍚庯紝鎴戜滑灏卞彲浠ヤ娇鐢ㄨ鎸囬拡鏉ユ搷浣?code>MyClass鐨勫疄渚嬨€?/p>
闇€瑕佹敞鎰忕殑鏄紝杩欑鏂规硶鍙兘妯℃嫙鍙嶅皠鐨勯儴鍒嗗姛鑳斤紝骞朵笖闇€瑕佹墜鍔ㄦ敞鍐岀被鐨勫厓鏁版嵁銆傚鏋滈渶瑕佹洿楂樼骇鐨勫弽灏勫姛鑳斤紝鍙兘闇€瑕佷娇鐢ㄧ涓夋柟搴撴垨妗嗘灦銆?/p>
相关问答