By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
431,827 Members | 2,267 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 431,827 IT Pros & Developers. It's quick & easy.

class factory linking issue

P: n/a
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
Jul 22 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a

"Aaron Prillaman" <pr********@cox.net> wrote in message
news:0o6Mc.31248$SD3.15597@okepread06...
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
Jul 22 '05 #2

P: n/a

"Sharad Kala" <no******************@yahoo.com> wrote in message
news:2m************@uni-berlin.de...

"Aaron Prillaman" <pr********@cox.net> wrote in message
news:0o6Mc.31248$SD3.15597@okepread06...
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
Jul 22 '05 #3

P: n/a
John Harrison wrote:
"Sharad Kala" <no******************@yahoo.com> wrote in message
news:2m************@uni-berlin.de...
"Aaron Prillaman" <pr********@cox.net> wrote in message
news:0o6Mc.31248$SD3.15597@okepread06...
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
Jul 22 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.