Forward declaration and typedefs

Discussion in 'C++' started by Simon Elliott, Jan 7, 2005.

  1. For some time I've been using typedefs for STL containers for reasons
    outlined in:

    http://www.gotw.ca/gotw/046.htm

    However a major downside to this is that you can't forward declare a
    typedef of a STL container:

    #include <vector>
    struct foo
    {
    int f1;
    };
    typedef std::vector<foo> fooVector;
    // Can't forward declare fooVector

    However, by deriving a class from the container, it becomes possible to
    forward declare it:

    class fooVector:public std::vector<foo>{};

    This appears to allow me to treat fooVector as a std::vector<foo> and
    to forward declare it:

    class fooVector; // OK

    In general it's not recommended to inherit from STL containers because
    they don't have virtual destructors. Am I correct in thinking that the
    above usage is safe because I'm not dealing with the fooVector class
    polymorphically?

    Is there any way to improve on the above so that other developers don't
    inadvertantly use fooVector in a dangerous manner?


    --
    Simon Elliott http://www.ctsn.co.uk
    Simon Elliott, Jan 7, 2005
    #1
    1. Advertising

  2. Simon Elliott wrote:
    ...
    >
    > In general it's not recommended to inherit from STL containers because
    > they don't have virtual destructors.


    Nonsense. It's perfectly safe to inherit from objects that don't have
    virtual destructors.

    Am I correct in thinking that the
    > above usage is safe because I'm not dealing with the fooVector class
    > polymorphically?


    see above.

    >
    > Is there any way to improve on the above so that other developers don't
    > inadvertantly use fooVector in a dangerous manner?


    Get better developers.
    Gianni Mariani, Jan 7, 2005
    #2
    1. Advertising

  3. Simon Elliott

    Howard Guest

    "Simon Elliott" <Simon at ctsn.co.uk> wrote in message
    news:41debb25$0$23051$...
    > For some time I've been using typedefs for STL containers for reasons
    > outlined in:
    >
    > http://www.gotw.ca/gotw/046.htm
    >
    > However a major downside to this is that you can't forward declare a
    > typedef of a STL container:
    >
    > #include <vector>
    > struct foo
    > {
    > int f1;
    > };
    > typedef std::vector<foo> fooVector;
    > // Can't forward declare fooVector
    >
    > However, by deriving a class from the container, it becomes possible to
    > forward declare it:
    >
    > class fooVector:public std::vector<foo>{};
    >
    > This appears to allow me to treat fooVector as a std::vector<foo> and
    > to forward declare it:
    >
    > class fooVector; // OK
    >
    > In general it's not recommended to inherit from STL containers because
    > they don't have virtual destructors. Am I correct in thinking that the
    > above usage is safe because I'm not dealing with the fooVector class
    > polymorphically?
    >
    > Is there any way to improve on the above so that other developers don't
    > inadvertantly use fooVector in a dangerous manner?
    >


    I'm not sure why you would want to forward declare that in the first
    place...? A forward declaration is needed when you have a dependency on an
    external class (or between classes in the same header), such as having a
    pointer to another class inside your class. But if you're including the
    <vector> header in your header, and you've successfully typedef'd it there,
    what's to prevent you from including in instance of (or pointer to) that new
    type it in your class? Why do you need to forward declare it? Like this:

    // .h file
    #ifndef MYVEC_H
    #define MYVEC_H

    #include <vector>

    typedef std::vector<int>MyVector;

    class VectorHolder
    {
    MyVector m_vector;
    };

    #endif
    // end .h file

    That works for me. What problem are you having that requires a forward
    declaration?

    -Howard



    -Howard
    Howard, Jan 7, 2005
    #3
  4. Simon Elliott

    Howard Guest


    > pointer to another class inside your class. But if you're including the
    > <vector> header in your header, and you've successfully typedef'd it
    > there, what's to prevent you from including in instance of (or pointer to)
    > that new type it in your class? Why do you need to forward declare it?
    > Like this:
    >


    Should read:

    > ...But if you're including the <vector> header in your header, and you've
    > successfully typedef'd it there, what's to prevent you from including an
    > instance of (or pointer to) that new type in your class?
    Howard, Jan 7, 2005
    #4
  5. On 07/01/2005, Howard wrote:

    > // .h file
    > #ifndef MYVEC_H
    > #define MYVEC_H
    >
    > #include <vector>
    >
    > typedef std::vector<int>MyVector;
    >
    > class VectorHolder
    > {
    > MyVector m_vector;
    > };
    >
    > #endif
    > // end .h file


    Let's call this header myvec.hpp.

    > That works for me. What problem are you having that requires a
    > forward declaration?


    Two reasons:

    1/ Elimination of headers. Suppose I want to have a pointer or
    reference to MyVector in another header, but I don't want to include
    myvec.hpp in that header. This reduces compile time dependencies and is
    considered a Good Thing.

    2/ Circular references. The classic example is when you have two
    classes which need to contain a pointer to each other:

    class bar; // Need this forward declaration to get this to compile

    class foo
    {
    bar* bar_ptr_;
    };

    class bar
    {
    foo* foo_ptr_;
    };

    --
    Simon Elliott http://www.ctsn.co.uk
    Simon Elliott, Jan 7, 2005
    #5
  6. On 07/01/2005, Gianni Mariani wrote:
    > > In general it's not recommended to inherit from STL containers
    > > because they don't have virtual destructors.

    >
    > Nonsense. It's perfectly safe to inherit from objects that don't
    > have virtual destructors.


    It's only safe if you can be sure that no-one is going to try to use
    the objects polymorphically.

    --
    Simon Elliott http://www.ctsn.co.uk
    Simon Elliott, Jan 7, 2005
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. qazmlp
    Replies:
    1
    Views:
    594
    Jonathan Turkanis
    Feb 15, 2004
  2. Jorge Yáñez

    Forward typedefs

    Jorge Yáñez, Dec 17, 2004, in forum: C++
    Replies:
    2
    Views:
    5,084
    David Harmon
    Dec 17, 2004
  3. Replies:
    5
    Views:
    511
    krema2ren
    Dec 8, 2005
  4. Noah Roberts
    Replies:
    7
    Views:
    669
    Bo Persson
    May 3, 2006
  5. kasiyil
    Replies:
    3
    Views:
    326
    Jens Theisen
    Aug 21, 2006
Loading...

Share This Page