Global static variable vs static method

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Marcin Vorbrodt

    Global static variable vs static method

    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


  • Gianni Mariani

    #2
    Re: Global static variable vs static method

    Marcin Vorbrodt wrote:[color=blue]
    > 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);
    > }[/color]

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

    [color=blue]
    >
    > 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);
    >[/color]

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

    Comment

    • Marcin Vorbrodt

      #3
      Re: Global static variable vs static method

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

      "Gianni Mariani" <gi2nospam@mari ani.ws> wrote in message
      news:bj96to$o6e @dispatch.conce ntric.net...[color=blue]
      > Marcin Vorbrodt wrote:[color=green]
      > > 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);
      > > }[/color]
      >
      > 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;
      > }
      >[/color]

      Makes sense, a friend just made that sugestion to me few minutes ago
      actually.
      [color=blue]
      >[color=green]
      > >
      > > The problem is, that this is a class with only static methods. All the[/color][/color]
      class[color=blue][color=green]
      > > has are just some methods that return certain constants, it also has[/color][/color]
      statics[color=blue][color=green]
      > > for trig functions. A friend pointed out, that it might not be such a[/color][/color]
      great[color=blue][color=green]
      > > design. On the other hand, i dont want to use this:
      > >
      > > static const Real PI = 4.0 * atan(1.0);
      > >[/color]
      >
      > I don't think you want static const Real PI. A static variable has to
      > do with a deprecated C functionality.
      >[/color]

      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.
      [color=blue]
      > 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 !
      >[/color]

      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.
      [color=blue]
      > 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 );
      >[/color]

      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
      CoordinateSyste n::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


      Comment

      • Denis Perelyubskiy

        #4
        Re: Global static variable vs static method

        Marcin Vorbrodt, 9/4/2003 10:56 PM:[color=blue]
        > "Gianni Mariani" <gi2nospam@mari ani.ws> wrote in message
        > news:bj96to$o6e @dispatch.conce ntric.net...[color=green]
        >>Marcin Vorbrodt wrote:[/color][/color]
        [...snip...][color=blue][color=green]
        >>I don't think you want static const Real PI. A static variable has to
        >>do with a deprecated C functionality.
        >>[/color]
        > 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.[/color]

        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.

        Comment

        Working...