Problem with static variable definitions
Hi
I'm trying to implement a template based factory, following the
guidelines of the following article:
http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx
(I'm trying Factory 6: the template-factory).
I get it to work fine, but as soon as I define more than 1 static
factory, each one in a different class, I get the following error:
Creating library file: bin\libQtilities.a
../tmp\Logger.o: In function
`ZN9Qtilities24AbstractFormattingEngineD1Ev':
D:/ScinericSoftware/Products/Qtilities/trunk/include/Qtilities/
AbstractFormattingEngine.h:(.bss+0x8): multiple definition of
`Qtilities::FileLoggerEngine::factory'
../tmp\FileLoggerEngine.o:c:/Tools/Qt/2009.02/qt/include/QtCore/../../
src/corelib/tools/qstring.h:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
Below is some code to show exactly what I'm doing:
//! Factory interface which is used by factories to create
instances of registered class types.
/*!
*/
template <class BaseClass>
class FactoryInterface
{
public:
FactoryInterface() {}
virtual ~FactoryInterface() {}
virtual BaseClass *createInstance() = 0;
virtual QString getTag() = 0;
};
//! Factory item class which is used inside classes which can
register themselves as items in factories.
/*!
*/
template <class BaseClass,class ActualClass>
class FactoryItem : public FactoryInterface<BaseClass>
{
public:
FactoryItem() { tag = QString("");}
virtual ~FactoryItem() {}
virtual BaseClass *createInstance() {return new
ActualClass;}
QString getTag() { return tag; }
bool setTag(const QString& iface_tag) {
if (tag == QString("")) {
tag = iface_tag;
return true;
} else
return false;
}
private:
QString tag;
};
//! A factory class which can produce class instances through
registered factory interfaces.
/*!
*/
template <class BaseClass>
class Factory
{
public:
Factory() {}
~Factory() {}
void registerFactoryInterface(FactoryInterface<BaseClass>*
interface) {
if (interface->getTag() != QString(""))
reg_ifaces[interface->getTag()] = interface;
}
void unregisterFactoryInterface(const QString& tag)
{ reg_ifaces.remove(tag); }
QStringList registeredTags() { return reg_ifaces.keys(); }
bool isTagValid(const QString& tag) { return
reg_ifaces.contains(tag); }
BaseClass* createInstance(const QString& tag) {
if (isTagValid(tag))
return reg_ifaces.value(tag)->createInstance();
else
return 0;
}
private:
QMap<QString,FactoryInterface<BaseClass>* > reg_ifaces;
};
I then create classes with static FactoryItem factories in them as
shown below:
class FormattingEngine_Default : virtual public
AbstractFormattingEngine
{
public:
FormattingEngine_Default() : AbstractFormattingEngine() {
factory_item.setTag("Default");
}
~FormattingEngine_Default() {}
static FactoryItem<AbstractFormattingEngine,
FormattingEngine_Default> factory_item;
};
FactoryItem<AbstractFormattingEngine, FormattingEngine_Default>
FormattingEngine_Default::factory_item;
And another class like this:
class QTILITIES_SHARED_EXPORT FileLoggerEngine : virtual public
AbstractLoggerEngine
{
public:
FileLoggerEngine();
~FileLoggerEngine();
// Make this class a factory item
static FactoryItem<AbstractLoggerEngine, FileLoggerEngine>
factory;
};
FactoryItem<AbstractLoggerEngine, FileLoggerEngine>
FileLoggerEngine::factory;
If needed I can post the base classes as well. I hope I posted
everything that is necessary. To be honest, I wondered why the
FileLoggerEngine::factory variable needs to be defined outside the
class definition while I was reading the article, and now this gives
the problem.
Any ideas on why I get this error will be greatly appreciated.
Thanks in advance,
Jaco