473,396 Members | 1,877 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

C++, Class Object Factory, Template and some problem

I'm developing a pseudo-library for neural network. To simplify
librarary using i wont to implement a sistem to instantiate different
implementation of interface(Layer.h Neuron.h) passing a string to a
function of a ùregistry vlass that hold all sub-classes...

/* ------Neuron.h--------*/
#include <math.h>
namespace Mnetlib
{
class Neuron
{
public:
virtual ~Neuron(){};
virtual double Run(double arg)=0;
virtual double RunBack(double o,double e)=0;
protected:
double outvalue;
int mode;
double input;

};

/* ------Layer.h--------*/
#include <vector>
#include "Neuron.h"
#include "Exception.h"

namespace Mnetlib
{

class Layer
{
public:

/**
* Costruttore di base.
* @param n Numero di neuroni presenti nel layer.
*/
Layer(int n);

virtual ~Layer()=0;

virtual void backprop(){throw new
InstantiationException();};

protected:
std::vector<Neuron*vect;
int num;
};

}

/* ------Registry.h--------*/
#include "NeuronLib.h"
#include "LayerLib.h"
#include "Factory.h"
#include <map>
namespace Mnetlib
{

class Registry
{
public:
Registry();
~Registry();
Neuron * getNewNeuron(const std::string& name);
void registerNeuronFactory( NeuronClassFactory*
factory)
{
_neuronRegistry[factory->name()]=factory;
}
void registerLayerFactory( LayerClassFactory* factory)
{
_layerRegistry[factory->name()]=factory;
}
Layer* getLayer (const std::string& lName, const
std::string& nName,
int n);
protected:
std::map<std::string,NeuronClassFactory*>
_neuronRegistry;
std::map<std::string, LayerClassFactory*>
_layerRegistry;
NeuronFactoryWrapper<SigmoidNeuron>
sigmoidFactory;
NeuronFactoryWrapper<LinearNeuron>
linearFactory;
LayerFactoryWrapper<OffLineLayeroffFactory;
LayerFactoryWrapper<OnLineLayeronFactory;
};

}

/* ------Factory.h--------*/
#include "Neuron.h"
#include "Layer.h"
namespace Mnetlib
{

class NeuronClassFactory
{
public:
virtual ~NeuronClassFactory(){};
virtual Neuron* create()=0;
virtual std::string name()=0;

};

template < class T >
class NeuronFactoryWrapper : public NeuronClassFactory
{
public:
virtual ~NeuronFactoryWrapper(){};
virtual Neuron* create(){ return T::create();}
virtual std::string name(){ return T::name();}
};

class LayerClassFactory
{
public:
virtual ~LayerClassFactory(){};
virtual Layer* create()=0;
virtual std::string name()=0;

};

template < class T >
class LayerFactoryWrapper : public LayerClassFactory
{
public:
virtual ~LayerFactoryWrapper(){};
virtual Layer* create(){ return T::create();}
virtual std::string name(){ return T::name();}
void build();
};

}

/* ------NeuronLib.h--------*/

#include "Neuron.h"

#include <string>
namespace Mnetlib
{
class LinearNeuron: public Neuron
{
public:
~LinearNeuron(){};
double Run(double arg);
double RunBack(double o,double e);
static LinearNeuron* create(){ return new LinearNeuron();};
static std::string name(){ return "linear";} ;

};

class SigmoidNeuron: public Neuron
{
public:
~SigmoidNeuron(){};
double Run(double arg);
double RunBack(double o,double e);
static SigmoidNeuron* create(){ return new SigmoidNeuron();};
static std::string name(){ return "sigmoid";} ;

};
}

/* ------LayerLib.h--------*/

#include <string>
#include "Layer.h"

namespace Mnetlib
{

class OnLineLayer : public Layer
{
public:
OnLineLayer(int n);
~OnLineLayer(){};
static OnLineLayer* create(int n){ return new
OnLineLayer(n);};
static std::string name(){ return "online";} ;
void backprop();
};

class OffLineLayer : public Layer
{
public:
OffLineLayer();
~OffLineLayer(){};
static OffLineLayer* create(){ return new
OffLineLayer();};
static std::string name(){ return "offline";} ;
void backprop();
};

}

This code only for instantiate an object via some line

Registry reg;
Layer* l= reg.getLayer ("offline", "linear", n);

But at this time i have proble with linking...and some other
inconveninet like ciclic include...
Anyone have a good idea to solve this question??
Nov 16 '07 #1
1 3575
On Nov 16, 6:16 pm, neoairus <francesco.ame...@gmail.comwrote:
But at this time i have proble with linking...and some other
inconveninet like ciclic include...
Anyone have a good idea to solve this question??
If you have cyclic include problems, a couple of
thoughts come to mind.

- Use include cards on all header files.
- If you don't require to include in the header file, don't i.e.
use forward declarations. A quick look at your code indicates
a couple of examples where this would have sufficed.
- Where possible (if not constrained by execution speed, which
I seriously doubt) move your implementation to .c* files (source
files).
- If you still have linker errors, make sure all static members
have definitions and make sure inline functions defined outside
of the body of classes are indicated as inline if they exist
in the header file.
- Make sure that pure virtual destructors have definitions.
- Make sure that all functions that are called have definitions.
Functions that arent't called don't require definitions. An
example of this is private copy constructor/assigment operator
without definition for the purpose of copying prevention (as
with boost::noncopyable).

Hope this helped.

Werner
Nov 16 '07 #2

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
by: Johan Bergman | last post by:
Hi, Maybe someone can help me with this one. The following describes a somewhat simplified version of my problem, but I think it will be sufficient. I want to use class factories (virtual...
17
by: Aguilar, James | last post by:
My previous example used the concept of a Shape class heirarchy, so I will continue with that. Suppose I have something like fifty different shapes, and I am trying to instantiate one of them. ...
1
by: Patrick Stinson | last post by:
I am trying to create a way to register static members of a **class**, not an object, for making an object factory. The main thing I want is to be able to make a call like class MyClass {...
18
by: Erik Arner | last post by:
Hi, I really need some help here. After upgrading to g++ 3.4 I have run into all sorts of troubles that I'm sure depends on my lack of proper understanding of C++. I would now like to get it right...
7
by: mathieu | last post by:
Hello, I did read the FAQ on template(*), since I could not find an answer to my current issue I am posting here. I have tried to summarize my issue in the following code (**). Basically I am...
25
by: David Sanders | last post by:
Hi, As part of a simulation program, I have several different model classes, ModelAA, ModelBB, etc., which are all derived from the class BasicModel by inheritance. model to use, for example...
4
by: David Sanders | last post by:
Hi, I have a class depending on a template parameter: template<int n> class MyClass { }; I want the template parameter to be chosen according to a variable, e.g.
4
by: dascandy | last post by:
Hi, For a project I'm working on I'm kind-of-hacking my way around deriving a class from an interface or such to create a mock, but instead creating the mock directly. It is usable as the...
4
by: Bit Byter | last post by:
I want to write a (singleton) container for instances of my class templates, however, I am not too sure on how to: 1). Store the instances 2). How to write the acccesor method (instance()) to...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.