Connecting Tech Pros Worldwide Help | Site Map

class factory linking issue

Aaron Prillaman
Guest
 
Posts: n/a
#1: Jul 22 '05
I'm trying to set up a class factory for loading classes from a
database. Each table will be loaded into it's own class with a common
base. Just thought I'd try a simple sample first, but I'm having
trouble getting it to link. Here's the code and output:

class c1{
public:
virtual void fn()=0;
};

class factory{
private:
static std::map<int,c1*(*)()> load_fns;
public:
factory(int key,c1*(*pfn)()){
load_fns.insert(std::make_pair(key,pfn));
}
static c1* Make(int key){
return load_fns[key]();
}
};

class c2 : public c1{
public:
void fn(){ std::cout << "running c2 fn\n";}
static c1* ld(){return new c2;}
static factory f;
};
factory c2::f(2,&c2::ld);

class c3 : public c1{
public:
void fn(){ std::cout << "running c3 fn\n";}
static c1* ld(){return new c3;}
static factory f;
};
factory c3::f(3,&c3::ld);


int main(int argc, char *argv[]){

c1* pc = factory::Make(2);
c1* pc2 = factory::Make(3);

pc->fn();
pc2->fn();

delete pc;
delete pc2;

return 0;
}

main.obj : error LNK2001: unresolved external symbol "private: static
class std::map<int,class c1 * (__cdecl*)(void),struct
std::less<int>,class std::allocator<class c1 * (__cdecl*)(void)> >
factory::load_fns" (?load_fns@factory@@0V?$map@HP6APAVc1@@
XZU?$less@H@std@@V?$allocator@P6APAVc1@@XZ@3@@std@ @A)
Release/test.exe : fatal error LNK1120: 1 unresolved externals
Sharad Kala
Guest
 
Posts: n/a
#2: Jul 22 '05

re: class factory linking issue



"Aaron Prillaman" <prillamana@cox.net> wrote in message
news:0o6Mc.31248$SD3.15597@okepread06...[color=blue]
> I'm trying to set up a class factory for loading classes from a
> database. Each table will be loaded into it's own class with a common
> base. Just thought I'd try a simple sample first, but I'm having
> trouble getting it to link. Here's the code and output:
>
> class c1{
> public:
> virtual void fn()=0;
> };
>
> class factory{
> private:
> static std::map<int,c1*(*)()> load_fns;
> public:
> factory(int key,c1*(*pfn)()){
> load_fns.insert(std::make_pair(key,pfn));
> }
> static c1* Make(int key){
> return load_fns[key]();
> }
> };[/color]

Add this line -
std::map<int,c1*(*)()> factory::load_fns;

-Sharad


John Harrison
Guest
 
Posts: n/a
#3: Jul 22 '05

re: class factory linking issue



"Sharad Kala" <no__spam.sharadk_ind@yahoo.com> wrote in message
news:2mcantFkpob7U1@uni-berlin.de...[color=blue]
>
> "Aaron Prillaman" <prillamana@cox.net> wrote in message
> news:0o6Mc.31248$SD3.15597@okepread06...[color=green]
> > I'm trying to set up a class factory for loading classes from a
> > database. Each table will be loaded into it's own class with a common
> > base. Just thought I'd try a simple sample first, but I'm having
> > trouble getting it to link. Here's the code and output:
> >
> > class c1{
> > public:
> > virtual void fn()=0;
> > };
> >
> > class factory{
> > private:
> > static std::map<int,c1*(*)()> load_fns;
> > public:
> > factory(int key,c1*(*pfn)()){
> > load_fns.insert(std::make_pair(key,pfn));
> > }
> > static c1* Make(int key){
> > return load_fns[key]();
> > }
> > };[/color]
>
> Add this line -
> std::map<int,c1*(*)()> factory::load_fns;
>[/color]

In a source file, not a header file.

john


Aaron Prillaman
Guest
 
Posts: n/a
#4: Jul 22 '05

re: class factory linking issue


John Harrison wrote:[color=blue]
> "Sharad Kala" <no__spam.sharadk_ind@yahoo.com> wrote in message
> news:2mcantFkpob7U1@uni-berlin.de...
>[color=green]
>>"Aaron Prillaman" <prillamana@cox.net> wrote in message
>>news:0o6Mc.31248$SD3.15597@okepread06...
>>[color=darkred]
>>>I'm trying to set up a class factory for loading classes from a
>>>database. Each table will be loaded into it's own class with a common
>>>base. Just thought I'd try a simple sample first, but I'm having
>>>trouble getting it to link. Here's the code and output:
>>>
>>>class c1{
>>>public:
>>> virtual void fn()=0;
>>>};
>>>
>>>class factory{
>>>private:
>>> static std::map<int,c1*(*)()> load_fns;
>>>public:
>>> factory(int key,c1*(*pfn)()){
>>> load_fns.insert(std::make_pair(key,pfn));
>>> }
>>> static c1* Make(int key){
>>> return load_fns[key]();
>>> }
>>>};[/color]
>>
>>Add this line -
>>std::map<int,c1*(*)()> factory::load_fns;
>>[/color]
>
>
> In a source file, not a header file.
>
> john
>
>[/color]
doh!
sorry that should have been obvious..
guess i was just up too late working on this

thanks a lot for the help,
Aaron
Closed Thread