initialization sequence in header file

Z

zl2k

I have a header file like this:

#include <map>
#include <set>

struct SET_CREATOR{
static std::set<std::string> CreateSet() {
std::set<std::string> string_set;
string_set.insert("ab");
return string_set;
}
};
static std::set<std::string> MY_STRING_SET(SET_CREATOR::CreateSet());

struct MAP_CREATOR{
static std::map<std::string, std::string> CreateMap() {
std::map<std::string, std::string> string_map;
std::cout<<*MY_STRING_SET.cbegin()<<std::endl; // segmentation
error here
return string_map;
}
};
static std::map<std::string, std::string>
MY_STRING_MAP(MAP_CREATOR::CreateMap());

My question is: how may I initialize MY_STRING_SET properly so that it
can be used by other struct in the same header file? Thanks for help.

zl2k
 
V

Victor Bazarov

I have a header file like this:

#include<map>
#include<set>

struct SET_CREATOR{
static std::set<std::string> CreateSet() {
std::set<std::string> string_set;
string_set.insert("ab");
return string_set;
}
};
static std::set<std::string> MY_STRING_SET(SET_CREATOR::CreateSet());

This defines a global variable (that's the intent, yes?) but the
definition is in the header, which means each module that includes that
header will have its own 'MY_STRING_SET' symbol, and they are *not*
related to each other at all.
struct MAP_CREATOR{
static std::map<std::string, std::string> CreateMap() {
std::map<std::string, std::string> string_map;
std::cout<<*MY_STRING_SET.cbegin()<<std::endl; // segmentation
error here
return string_map;
}
};
static std::map<std::string, std::string>
MY_STRING_MAP(MAP_CREATOR::CreateMap());

My question is: how may I initialize MY_STRING_SET properly so that it
can be used by other struct in the same header file? Thanks for help.

Header files are not compiled. They are text, parts of translation
units. You shouldn't ever *define* variables in headers. What is it
you're trying to do? What you're probably running into is "static
object initialization fiasco", where you're trying to use the static
object (the set in your case) before it has been properly initialized.

A way to avoid that is to make sure the objects are initialized in
proper sequence by calling those function one after the other in another
initializer. But first sort out the "static" issue and the fact that
they are *defined* in a header.

If you're trying to create a singleton (or two singletons with the
second one aware of the first), there are code patterns for that. Try
googling "singleton C++".

V
 
Z

zl2k

This defines a global variable (that's the intent, yes?) but the
definition is in the header, which means each module that includes that
header will have its own 'MY_STRING_SET' symbol, and they are *not*
related to each other at all.





Header files are not compiled.  They are text, parts of translation
units.  You shouldn't ever *define* variables in headers.  What is it
you're trying to do?  What you're probably running into is "static
object initialization fiasco", where you're trying to use the static
object (the set in your case) before it has been properly initialized.

A way to avoid that is to make sure the objects are initialized in
proper sequence by calling those function one after the other in another
initializer.  But first sort out the "static" issue and the fact that
they are *defined* in a header.

If you're trying to create a singleton (or two singletons with the
second one aware of the first), there are code patterns for that.  Try
googling "singleton C++".

V

Thank you, it is the "static object initialization fiasco". I use the
SET_CREATOR::CreateSet() inside of the 2nd struct and the problem is
solved.
zl2k
 

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

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,052
Latest member
LucyCarper

Latest Threads

Top