class factory linking issue

A

Aaron Prillaman

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
 
S

Sharad Kala

Aaron Prillaman said:
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]();
}
};

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

-Sharad
 
J

John Harrison

Sharad Kala said:
Aaron Prillaman said:
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]();
}
};

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

In a source file, not a header file.

john
 
A

Aaron Prillaman

John said:
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]();
}
};

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


In a source file, not a header file.

john
doh!
sorry that should have been obvious..
guess i was just up too late working on this

thanks a lot for the help,
Aaron
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top