Global static variable vs static method

Discussion in 'C++' started by Marcin Vorbrodt, Sep 5, 2003.

  1. So I have a class Math that looks like this:

    Math {
    public:
    static Real PI(void);
    };

    Real Math::pI(void) {
    return 4.0 * atan(1.0);
    }

    The problem is, that this is a class with only static methods. All the class
    has are just some methods that return certain constants, it also has statics
    for trig functions. A friend pointed out, that it might not be such a great
    design. On the other hand, i dont want to use this:

    static const Real PI = 4.0 * atan(1.0);

    Because i dont know the order in which statics are initialized, and some
    other static could later depend on the value of PI;

    Any ideas? Is there a more graceful solution to the problem of global static
    values in C++.

    Martin
    Marcin Vorbrodt, Sep 5, 2003
    #1
    1. Advertising

  2. Marcin Vorbrodt wrote:
    > So I have a class Math that looks like this:
    >
    > Math {
    > public:
    > static Real PI(void);
    > };
    >
    > Real Math::pI(void) {
    > return 4.0 * atan(1.0);
    > }


    This one would do more like what you want. It is computed on demand the
    first time Math::pI is called and only the first time.

    Real Math::pI(void) {
    static Real pi = 4.0 * atan(1.0);

    return pi;
    }


    >
    > The problem is, that this is a class with only static methods. All the class
    > has are just some methods that return certain constants, it also has statics
    > for trig functions. A friend pointed out, that it might not be such a great
    > design. On the other hand, i dont want to use this:
    >
    > static const Real PI = 4.0 * atan(1.0);
    >


    I don't think you want static const Real PI. A static variable has to
    do with a deprecated C functionality.

    const Real PI = 3.14159...;

    is a whole lot faster. Just compute the constants and slap them into
    the text. What's wrong with that - they are constants after all !

    A constant initialized with a constant expression ( no function calls -
    like to atan ) is initialized at compile time. You can be guarenteed
    they are set from the time the executable is loaded.


    #include <cmath>

    class A
    {
    public:

    static const double pi ;

    };

    // initialized at compile time
    const double A::pi = 3.141L;

    // initialized at compile time
    const double AnotherPI = 3.141L;

    // initialized at compile time when executable is loaded
    const double AnotherPI2 = 4 * atan( 1.0 );
    Gianni Mariani, Sep 5, 2003
    #2
    1. Advertising

  3. Thanks a bunch for responding!
    Got few questions though...

    "Gianni Mariani" <> wrote in message
    news:bj96to$...
    > Marcin Vorbrodt wrote:
    > > So I have a class Math that looks like this:
    > >
    > > Math {
    > > public:
    > > static Real PI(void);
    > > };
    > >
    > > Real Math::pI(void) {
    > > return 4.0 * atan(1.0);
    > > }

    >
    > This one would do more like what you want. It is computed on demand the
    > first time Math::pI is called and only the first time.
    >
    > Real Math::pI(void) {
    > static Real pi = 4.0 * atan(1.0);
    >
    > return pi;
    > }
    >


    Makes sense, a friend just made that sugestion to me few minutes ago
    actually.

    >
    > >
    > > The problem is, that this is a class with only static methods. All the

    class
    > > has are just some methods that return certain constants, it also has

    statics
    > > for trig functions. A friend pointed out, that it might not be such a

    great
    > > design. On the other hand, i dont want to use this:
    > >
    > > static const Real PI = 4.0 * atan(1.0);
    > >

    >
    > I don't think you want static const Real PI. A static variable has to
    > do with a deprecated C functionality.
    >


    Deprecated C functionality. Please explain. What exactly would be a meaning
    of static const variable in C++ land versus just const variable defined at
    global scope.

    > const Real PI = 3.14159...;
    >
    > is a whole lot faster. Just compute the constants and slap them into
    > the text. What's wrong with that - they are constants after all !
    >


    Real is now typedef float real. It might be double in the future. Thats why
    i dont want to hardcode a value into const Real PI variable.

    > A constant initialized with a constant expression ( no function calls -
    > like to atan ) is initialized at compile time. You can be guarenteed
    > they are set from the time the executable is loaded.
    >
    >
    > #include <cmath>
    >
    > class A
    > {
    > public:
    >
    > static const double pi ;
    >
    > };
    >
    > // initialized at compile time
    > const double A::pi = 3.141L;
    >
    > // initialized at compile time
    > const double AnotherPI = 3.141L;
    >
    > // initialized at compile time when executable is loaded
    > const double AnotherPI2 = 4 * atan( 1.0 );
    >


    The problem with this is (I think)...
    If at some later time i create another static const variable in some other
    class like this:

    OtherClass {
    public:
    static const Something = Math::pI + 3; // just for the sake of this
    example :)
    };

    that at the time i create Something variable, PI might not yet been
    initialized.
    Or does that problem not apply to primitive types?

    I had this happen to me before with such code:

    Vector::UNIT_X; was a static const devined in vector class, and
    CoordinateSysten::GLOBAL; was constructed using Vector::UNIT_X, Y, Z, etc

    and on some compilers that would work, but on some, at the time of GLOBAL
    initialization, UNIT_X vector was not yet initialized.

    Thanks for you help!

    Martin
    Marcin Vorbrodt, Sep 5, 2003
    #3
  4. Marcin Vorbrodt, 9/4/2003 10:56 PM:
    > "Gianni Mariani" <> wrote in message
    > news:bj96to$...
    >>Marcin Vorbrodt wrote:

    [...snip...]
    >>I don't think you want static const Real PI. A static variable has to
    >>do with a deprecated C functionality.
    >>

    > Deprecated C functionality. Please explain. What exactly would be a meaning
    > of static const variable in C++ land versus just const variable defined at
    > global scope.


    I think Gianni was referring to deprecation of 'static', as used in
    namespaces.

    Here is a discussion: http://tinyurl.com/mbgt
    There is probably more information about that in this newsgroup, as
    it seems to have been discussed many times.

    denis

    --
    'From' email address is used as a sink. Not read. Ever.
    Instead, send to [p-o-s-t-i-n-g|o-v-e-r-w-h-e-l-m|n-e-t]
    (remove dashes, replace the first vertical bar with @,
    and second with a dot). Sorry for any inconvenience.
    Denis Perelyubskiy, Sep 5, 2003
    #4
    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. Patrick Hoffmann
    Replies:
    3
    Views:
    2,831
    Christian Jan├čen
    Aug 8, 2003
  2. ZelluX
    Replies:
    24
    Views:
    885
    Hendrik Maryns
    Nov 19, 2007
  3. Aakash
    Replies:
    3
    Views:
    3,835
    Roedy Green
    Jan 19, 2008
  4. drmario
    Replies:
    4
    Views:
    701
    James Kanze
    Apr 15, 2008
  5. Stefan Istrate

    Static variable & static method

    Stefan Istrate, Jun 6, 2008, in forum: C++
    Replies:
    8
    Views:
    358
    James Kanze
    Jun 7, 2008
Loading...

Share This Page