Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Header File Object Definition Trick

Reply
Thread Tools

Header File Object Definition Trick

 
 
Frederick Gotham
Guest
Posts: n/a
 
      10-07-2006

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;
}

--

Frederick Gotham
 
Reply With Quote
 
 
 
 
peter koch
Guest
Posts: n/a
 
      10-07-2006

Frederick Gotham wrote:
> 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

 
Reply With Quote
 
 
 
 
Phlip
Guest
Posts: n/a
 
      10-07-2006
peter koch wrote:

>> Do many people use a inline function to get around this?
>>
>> inline
>> int &GetGlobal()
>> {
>> static int i;
>> return i;
>> }

>
> 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 news:comp.object 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.

--
Phlip
http://www.greencheese.us/ZeekLand <-- NOT a blog!!!


 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      10-07-2006
peter koch wrote:
> Frederick Gotham wrote:
>> 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


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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
peter koch
Guest
Posts: n/a
 
      10-08-2006

Victor Bazarov wrote:
> peter koch wrote:
> > Frederick Gotham wrote:
> >> 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

>
> 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

 
Reply With Quote
 
peter koch
Guest
Posts: n/a
 
      10-08-2006

Phlip wrote:
> peter koch wrote:
>
> >> Do many people use a inline function to get around this?
> >>
> >> inline
> >> int &GetGlobal()
> >> {
> >> static int i;
> >> return i;
> >> }

> >
> > I don't hope so

>
> 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 news:comp.object 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

 
Reply With Quote
 
Kai-Uwe Bux
Guest
Posts: n/a
 
      10-08-2006
peter koch wrote:

>
> Victor Bazarov wrote:
>> peter koch wrote:
>> > Frederick Gotham wrote:
>> >> 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

>>
>> 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.


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
 
Reply With Quote
 
Frederick Gotham
Guest
Posts: n/a
 
      10-08-2006
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...

--

Frederick Gotham
 
Reply With Quote
 
peter koch
Guest
Posts: n/a
 
      10-12-2006

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).

> > 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


Surely. And this probably holds for any language.

/Peter

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Header files with "header.h" or <header.h> ?? mlt C++ 2 01-31-2009 02:54 PM
What is the benefit of putting a class definition in a header file. DaTurk C++ 6 01-25-2007 05:48 AM
How to avoid multiple definition of a variable by multiple inclusion of a header file lars.uffmann@rwth-aachen.de C++ 11 08-05-2006 10:24 PM
What is better /standard for creating files. a cpp file with header or cpp and seperate file for header DrUg13 C++ 1 02-10-2004 09:20 AM
how to avoid using another header file inside a header file? Newsgroup - Ann C++ 4 11-02-2003 01:20 PM



Advertisments