Header File Object Definition Trick

  • Thread starter Frederick Gotham
  • Start date
F

Frederick Gotham

Let's say you want to write a simple header file, and don't want to be
burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You could simply
make the object static... but then you'll have a separate object for each
source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}
 
P

peter koch

Frederick said:
Let's say you want to write a simple header file, and don't want to be
burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You could simply
make the object static... but then you'll have a separate object for each
source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}

I don't hope so ;-)

/Peter
 
P

Phlip

peter said:
I don't hope so ;-)

That's actually a common technique to make i a Singleton:

inline
SingleClass & getSingleton()
{
static SingleClass sc;
return sc;
}

The benefit is sc is well-defined to construct just before that function
enters. If sc were in the global data space, it would define at a random
time before main(), so any code that uses sc before main() would have
undefined behavior.

Now read "Singletonitis" in to avoid singleton abuse! And
don't put this crap in a header - write an implementation file for it. Some
small C++ applications can get by with header-only implementations, but
large scale C++ applications are bound by their compile times, so
implementation files are crucial.
 
V

Victor Bazarov

peter said:
I don't hope so ;-)

Why not? This is one of singleton implementations. Compare:

class MySingleton {
MySingleton(); // private c-tor, nobody else should construct
public:
static MySingleton& instance() {
static MySingleton s;
return s;
}
};

V
 
P

peter koch

Victor said:
Why not? This is one of singleton implementations. Compare:

class MySingleton {
MySingleton(); // private c-tor, nobody else should construct
public:
static MySingleton& instance() {
static MySingleton s;
return s;
}
};
Surely - I know that idiom. But Fredericks question was not about
singletons, but rather one of laziness. And when a singleton is
appropriate, you better write something more elaborate than what
Frederick wrote or you'll get in trouble. If for nothing else, theres
the problem about using the function in multithreaded code. This
suddenly is unsafe even if youre only reading.
So put shortly: don't do what Frederick suggests unless you have given
it good thought.

/Peter
 
P

peter koch

Phlip said:
That's actually a common technique to make i a Singleton:

inline
SingleClass & getSingleton()
{
static SingleClass sc;
return sc;
}
Correct.


The benefit is sc is well-defined to construct just before that function
enters. If sc were in the global data space, it would define at a random
time before main(), so any code that uses sc before main() would have
undefined behavior.

Now read "Singletonitis" in to avoid singleton abuse! And
don't put this crap in a header - write an implementation file for it. Some
small C++ applications can get by with header-only implementations, but
large scale C++ applications are bound by their compile times, so
implementation files are crucial.
Right. And it is not just compilation time that is an issue.

/Peter
 
K

Kai-Uwe Bux

peter said:
Surely - I know that idiom. But Fredericks question was not about
singletons, but rather one of laziness.

That maybe the way he put up the problem. However if your interface is
templated, your maybe forced to put your implementation into the header
(e.g., when your compiler does not support "export").

And when a singleton is
appropriate, you better write something more elaborate than what
Frederick wrote or you'll get in trouble. If for nothing else, theres
the problem about using the function in multithreaded code. This
suddenly is unsafe even if youre only reading.

I can see the problems with multithreading for the first call that needs to
create the variable. However, my eyes fail me for the subsequent calls.
Could you elaborate on this one -- it sounds interesting.

So put shortly: don't do what Frederick suggests unless you have given
it good thought.

Well, name some idiom in C++ for which that does not hold :)


Best

Kai-Uwe Bux
 
F

Frederick Gotham

peter koch posted:
Surely - I know that idiom. But Fredericks question was not about
singletons, but rather one of laziness.


Using a header just involves a simple #include.

Using a source file involves adding it to your "compile files" and so on...
 
P

peter koch

Kai-Uwe Bux skrev:
peter koch wrote:
[snip]
And when a singleton is
appropriate, you better write something more elaborate than what
Frederick wrote or you'll get in trouble. If for nothing else, theres
the problem about using the function in multithreaded code. This
suddenly is unsafe even if youre only reading.

I can see the problems with multithreading for the first call that needs to
create the variable. However, my eyes fail me for the subsequent calls.
Could you elaborate on this one -- it sounds interesting.

Well, I do not really have more to add. The only thing to be afraid of
is the first call. (That is two threads calling the same function for
the first time at about the same moment). But even if it sounds like an
unrealistic, it is not. My experience tells me that those problem will
occur if you do not take appropriate guards.
In this case I prefer a plain global variable - or a "real" function
that serialises the access in case there is some dependency you can not
get rid of (as you surely know, the order of construction within one
file is well-defined).
Well, name some idiom in C++ for which that does not hold :)

Surely. And this probably holds for any language.

/Peter
 

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,743
Messages
2,569,478
Members
44,898
Latest member
BlairH7607

Latest Threads

Top