⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 metaobject.h

📁 C++ class libraries for network-centric, portable applications, integrated perfectly with the C++ St
💻 H
字号:
//// MetaObject.h//// $Id: //poco/1.2/Foundation/include/Poco/MetaObject.h#1 $//// Library: Foundation// Package: SharedLibrary// Module:  ClassLoader//// Definition of the MetaObject class.//// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.// and Contributors.//// Permission is hereby granted, free of charge, to any person or organization// obtaining a copy of the software and accompanying documentation covered by// this license (the "Software") to use, reproduce, display, distribute,// execute, and transmit the Software, and to prepare derivative works of the// Software, and to permit third-parties to whom the Software is furnished to// do so, all subject to the following:// // The copyright notices in the Software and this entire statement, including// the above license grant, this restriction and the following disclaimer,// must be included in all copies of the Software, in whole or in part, and// all derivative works of the Software, unless such copies or derivative// works are solely in the form of machine-executable object code generated by// a source language processor.// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER// DEALINGS IN THE SOFTWARE.//#ifndef Foundation_MetaObject_INCLUDED#define Foundation_MetaObject_INCLUDED#include "Poco/Foundation.h"#include "Poco/Exception.h"#include "Poco/SingletonHolder.h"#include <set>namespace Poco {template <class B>class AbstractMetaObject	/// A MetaObject stores some information	/// about a C++ class. The MetaObject class	/// is used by the Manifest class.	/// AbstractMetaObject is a common base class	/// for all MetaObject in a rooted class hierarchy.	/// A MetaObject can also be used as an object	/// factory for its class.{public:	AbstractMetaObject(const char* name): _name(name)	{	}	virtual ~AbstractMetaObject()	{		for (typename ObjectSet::iterator it = _deleteSet.begin(); it != _deleteSet.end(); ++it)		{			delete *it;		}	}	const char* name() const	{		return _name;	}	virtual B* create() const = 0;		/// Create a new instance of a class.		/// Cannot be used for singletons.			virtual B& instance() const = 0;		/// Returns a reference to the only instance		/// of the class. Used for singletons only.	virtual bool canCreate() const = 0;		/// Returns true iff the create method can be used		/// to create instances of the class.		/// Returns false if the class is a singleton.	virtual void destroy(B* pObject) const		/// If pObject was owned by meta object, the		/// ownership of the deleted object is removed		/// and the object is deleted.	{		typename ObjectSet::iterator it = _deleteSet.find(pObject);				if (it != _deleteSet.end())		{			_deleteSet.erase(pObject);			delete pObject;		}	}	B* autoDelete(B* pObject) const		/// Give ownership of pObject to the meta object.		/// The meta object will delete all objects it owns		/// when it is destroyed.		///		/// Returns pObject.	{		if (this->canCreate()) // guard against singleton		{			poco_check_ptr (pObject);			_deleteSet.insert(pObject);		}		else throw InvalidAccessException("Cannot take ownership of", this->name());		return pObject;	}	virtual bool isAutoDelete(B* pObject) const		/// Returns true if the object is owned		/// by meta object.		///		/// Overloaded in MetaSingleton - returns true		/// if the class is a singleton.	{		return _deleteSet.find(pObject) != _deleteSet.end();	}private:	AbstractMetaObject();	AbstractMetaObject(const AbstractMetaObject&);	AbstractMetaObject& operator = (const AbstractMetaObject&);	typedef std::set<B*> ObjectSet;		const char* _name;	mutable ObjectSet _deleteSet;};template <class C, class B>class MetaObject: public AbstractMetaObject<B>	/// A MetaObject stores some information	/// about a C++ class. The MetaObject class	/// is used by the Manifest class.	/// A MetaObject can also be used as an object	/// factory for its class.{public:	MetaObject(const char* name): AbstractMetaObject<B>(name)	{	}	~MetaObject()	{	}	B* create() const	{		return new C;	}		B& instance() const	{		throw InvalidAccessException("Not a singleton. Use create() to create instances of", this->name());	}		bool canCreate() const	{		return true;	}};template <class C, class B> class MetaSingleton: public AbstractMetaObject<B> 	/// A SingletonMetaObject disables the create() method	/// and instead offers an instance() method to access	/// the single instance of its class. { public: 	MetaSingleton(const char* name): AbstractMetaObject<B>(name) 	{	}		~MetaSingleton() 	{	}		B* create() const	{		throw InvalidAccessException("Cannot create instances of a singleton class. Use instance() to obtain a", this->name());	}		bool canCreate() const	{		return false;	}	B& instance() const	{		return *_object.get();	}      	bool isAutoDelete(B* pObject) const	{		return true;	}private: 	mutable SingletonHolder<C> _object; }; } // namespace Poco#endif // Foundation_MetaObject_INCLUDED

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -