Solved

Can you explain the use of static in named constructors?

Posted on 2002-05-28
9
191 Views
Last Modified: 2010-04-02
I took this example of named constructors from Marshall Cline's FAQ-lite: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

     class Point {
     public:
       static Point rectangular(float x, float y);      // Rectangular coord's
       static Point polar(float radius, float angle);   // Polar coordinates
       // These static methods are the so-called "named constructors"
       // ...
     private:
       Point(float x, float y);     // Rectangular coordinates
       float x_, y_;
     };
     

Bjarne Stroustrup in "The C++ programming language"  second edition p. 166, bottom of section 5.4.4 Static Members says:  "For member functions, static has only the second meaning."  That second meaning from the previous sentence is: " static as in `restricted visibility' as opposed to external linkage."

And yet, there seems to be more that restricted visibility going on here.  If this were just a matter of restricted visibility, it should be possible to do the same without that restricted visibility.  

Can the above example to modified to eliminate the visibility restriction on Point::rectangular and Point::Polar?

I don't claim that there is a good reason to do so.  I am just
trying to understand the concept here.  

Thanks,
  Ken

0
Comment
Question by:klopter
  • 4
  • 3
  • 2
9 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 100 total points
ID: 7039376
>>Can the above example to modified to eliminate the
>>visibility restriction on Point::rectangular and
>>Point::Polar?

Yes, you could use a function that serves as a 'class factory', e.g.

    class Point {

    friend Point PointFactoryFromRectangular ( float x, float y);
    friend Point PointFactoryFromPolar ( float r, float phi);
    public:
    private:
      Point(float x, float y);     // Rectangular coordinates
      float x_, y_;
    };
   
Point PointFactoryFromRectangular ( float x, float y) {

 return Point ( x, y);
}

Point PointFactoryFromPolar ( float r, float phi) {

// tranform coordinates to rectangular and create object
 return Point ( x, y);
}



0
 
LVL 2

Expert Comment

by:mirtol
ID: 7039478
You've got a whole loada things going on here:

static func()
 - Is a member of the class
 - it cannot access object-specific data, only class-specific data UNLESS a pointer is passed to it, then it may access object-specific data.
 - it can be called globally, via reference to the class and from the object (ie: func(), CLASS::func() or OBJ->func())

friend func()
 - Is NOT a member of the class
 - it cannot access object-specific data, only class-specific data UNLESS a pointer is passed to it, then it may access object-specific data.
 - it may only be called globally (ie: func())

func()
 - Is a member of the class
 - May access object-specific data using 'this' pointer
 - it can only be called from the object (ie: OBJ->func())
0
 
LVL 86

Expert Comment

by:jkr
ID: 7039482
BTW, to address 'the use of static' - in this sample, the members have to be static in order be abler to be called without an instance of the class. As you see, the only ctor is 'private', so you either need 'friends' or members...
0
 
LVL 2

Expert Comment

by:mirtol
ID: 7039488
So I guess in answer to your question - No, not exactly as the very definition of static denies you that. But by passing a pointer to your object you may restore the visibility.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:klopter
ID: 7039655
I think that I pretty much get it now.  I still find Bjarne's description of the meaning of static as "restricted visibility" unhelpful here.  

I see static in this situation as meaning "callable without an object".  Or, making CLASS::func() legal.  Exactly as jkr's second comment says.

I am confused by mirtol's claim that "static func()" allows one to call func() globally.  When I removed the "Point::" from the following it would no lonber compile.
 
Point p1 = Point::rectangular(5.7,1.2);

Thanks,
  Ken
0
 
LVL 86

Expert Comment

by:jkr
ID: 7039672
You cannot use 'rectangular' without specifying to which class it belongs... unless you call it from another method of that class...
0
 
LVL 2

Expert Comment

by:mirtol
ID: 7039680
Me wrong. static can't be called globally. Sorry.
0
 
LVL 86

Expert Comment

by:jkr
ID: 7039691
BTW - to get back to the headline of your Q:

>>Can you explain the use of static in named constructors?

There is no such thing as 'named constructors', these are simply static member functions (IOW: Member functions that can be used without an instance of the class) that create an instance of that class and serve as a class factory. They need to be members as the the only ctor is 'private', and they need to be static to be accesible at all.
0
 

Author Comment

by:klopter
ID: 7039749
mirtol - Thanks for your comments.  They were also helpful.

Ken
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
MSVCR80.dll crash 2 134
C Language combined operators 28 106
ASP.net build a IF/Then Walkthrough Guide 1 191
Arduino EDI - Programming language 3 80
In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

895 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now