Login | Register   
RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX

By submitting your information, you agree that devx.com may send you DevX offers via email, phone and text message, as well as email offers about other products and services that DevX believes may be of interest to you. DevX will process your information in accordance with the Quinstreet Privacy Policy.

Tip of the Day
Language: C++
Expertise: Beginner
Sep 10, 1998



Building the Right Environment to Support AI, Machine Learning and Deep Learning

Be Cautious with Local Static Variables in a Member Function

The object model of C++ ensures that each object instance gets its own copy of data members (except for static ones). On the other hand, all instances of a base class, as well as instances of classes derived from it, share a single copy of the member functions of the base class. Therefore, declaring a local static variable (not to be confused with static class members) in a member function can cause surprises like this:
class Base {
	public: int countCalls() { static int cnt = 0; return ++cnt; } };
class Derived1 : public Base { /*..*/};
class Derived2 : public Base { /*..*/};
Derived1 d1;
int d1Calls = d1.countCalls(); //d1Calls = 1
Derived2 d2;
int d2Calls = d2.countCalls(); //d2Calls = 2 and not 1 
The above example may be used to measure load balancing by counting the total number of invocations of the countCalls member function, regardless of the actual object from which it was called. However, obviously that programmer's intention was to count the number of invocations through Derived2 class exclusively. In order to achieve that, a static class member would be preferable:
class Base {
	private: static int i; //static class member rather than a local static variable
	public: virtual int countCalls() {  return ++i; } };
class Derived1 : public Base {
private: static int i; //hides Base::i
	public: int countCalls() {  return ++i; } //overrides Base:: countCalls()  };
class Derived2 : public Base {
private: static int i; //hides Base::i and distinct from Derived1::i
	public: virtual int countCalls() {  return ++i; } };
Derived1 d1; Derived2 d2;
int d1Calls = d1.countCalls(); //d1Calls = 1
int d2Calls = d2.countCalls(); //d2Calls also = 1 
Danny Kalev
Comment and Contribute






(Maximum characters: 1200). You have 1200 characters left.



Thanks for your registration, follow us on our social networks to keep up-to-date