Global static variable vs static method

  • Thread starter Marcin Vorbrodt
  • Start date
M

Marcin Vorbrodt

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
 
G

Gianni Mariani

Marcin said:
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 );
 
M

Marcin Vorbrodt

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

Gianni Mariani said:
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.
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
 
D

Denis Perelyubskiy

Marcin Vorbrodt, 9/4/2003 10:56 PM:
Gianni Mariani said:
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
 

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

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top