Header File Object Definition Trick

Discussion in 'C++' started by Frederick Gotham, Oct 7, 2006.

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

    int &GetGlobal()
    static int i;
    return i;
    Frederick Gotham, Oct 7, 2006
    1. Advertisements

  2. Frederick Gotham

    peter koch Guest

    I don't hope so ;-)

    peter koch, Oct 7, 2006
    1. Advertisements

  3. Frederick Gotham

    Phlip Guest

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

    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.
    Phlip, Oct 7, 2006
  4. Why not? This is one of singleton implementations. Compare:

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

    Victor Bazarov, Oct 7, 2006
  5. Frederick Gotham

    peter koch Guest

    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 koch, Oct 8, 2006
  6. Frederick Gotham

    peter koch Guest

    Right. And it is not just compilation time that is an issue.

    peter koch, Oct 8, 2006
  7. Frederick Gotham

    Kai-Uwe Bux Guest

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

    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, name some idiom in C++ for which that does not hold :)


    Kai-Uwe Bux
    Kai-Uwe Bux, Oct 8, 2006
  8. peter koch posted:

    Using a header just involves a simple #include.

    Using a source file involves adding it to your "compile files" and so on...
    Frederick Gotham, Oct 8, 2006
  9. Frederick Gotham

    peter koch Guest

    Kai-Uwe Bux skrev:
    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).
    Surely. And this probably holds for any language.

    peter koch, Oct 12, 2006
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.