Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > why it's not possible calling constructor from constructor?

Reply
Thread Tools

why it's not possible calling constructor from constructor?

 
 
Giulio
Guest
Posts: n/a
 
      06-25-2003
why definition of two constructors like these is not possible in c++???

-----------------------
date::date(const int d, const int m, const int y, const int ora, const int
mi, const int se){
day_ = d;
month_ = m;
year_ = y;

secondo_ = se;
minuto_ = mi;
ora_ = ora;
}

date::date(){ date(0,0,0,0,0,0); }
---------------

thanx
Giulio




 
Reply With Quote
 
 
 
 
Patrick Kowalzick
Guest
Posts: n/a
 
      06-25-2003
> class date {
> public:
> date(const int & d=0,const int & m=0, const int & y=0, const int & ora=0,
> const int & mi=0, const int & se=0)
> : day(d), month(m),year(y),secondo(se),minuto(mi),ora(ora) {}
> private:
> int day,month,year,secondo,minuto,ora;
> };

Argh, forgotten something

with this constructor you have a lot constructors - perhaps too much. You
have to check this in each case:

date();
date(int);
date(int,int);
date(int,int,int);
date(int,int,int,int);
date(int,int,int,int,int);
date(int,int,int,int,int,int);

Greetings,
Patrick


 
Reply With Quote
 
 
 
 
Simon Saunders
Guest
Posts: n/a
 
      06-25-2003
"Giulio" <giulio.gL E V http://www.velocityreviews.com/forums/(E-Mail Removed)> wrote in message
news:c8eKa.39293$(E-Mail Removed). ..
> why definition of two constructors like these is not possible in c++???
>
> -----------------------
> date::date(const int d, const int m, const int y, const int ora, const int
> mi, const int se){
> day_ = d;
> month_ = m;
> year_ = y;
>
> secondo_ = se;
> minuto_ = mi;
> ora_ = ora;
> }
>
> date::date(){ date(0,0,0,0,0,0); }
> ---------------
>


The second constructor creates an unnamed temporary object; that's just the
way C++ works. The usual workaround is to write a private member function to
do the initialization and call that from both constructors, for example:

date::date(int d, int m, int y, int ora, int mi, int se)
{
init(d, m, y, ora, mi, se);
}

date::date()
{
init(0, 0, 0, 0, 0, 0);
}

void date::init(int d, int m, int y, int ora, int mi, int se)
{
day_ = d;
month_ = m;
year_ = y;
secondo_ = se;
minuto_ = mi;
ora_ = ora;
}


 
Reply With Quote
 
tom_usenet
Guest
Posts: n/a
 
      06-25-2003
On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
(E-Mail Removed)> wrote:

>why definition of two constructors like these is not possible in c++???


The construction model in C++ is quite strict (mostly due to the fact
that C++ has "value-based" UDTs rather than just pointers, as in
Java). Basically, by the time you enter the body of your constructor,
all of your base classes and all of your member variables will already
have been constructed. So there is no way to invoke another
constructor from the body of your constructor, because that would
involve double construction of all your variables.

If you just want to share just the body of the constructor, then
refactor it out into a separate function that both of your
constructors call.

>
>-----------------------
>date::date(const int d, const int m, const int y, const int ora, const int
>mi, const int se){
> day_ = d;
> month_ = m;
> year_ = y;
>
> secondo_ = se;
> minuto_ = mi;
> ora_ = ora;
>}


Normally that would be done using an initializer list:
date::date(const int d, const int m, const int y, const int ora, const
int mi, const int se)
:day_(d),
month_(m),
year_(y),
secondo_(se),
minuto_(mi),
ora_(ora)
{
}


>date::date(){ date(0,0,0,0,0,0); }


date::date()
:day_(0),
month_(0),
year_(0),
secondo_(0),
minuto_(0),
ora_(0)
{
}

As you can see, there is no code in the body at all, so there's no
common code to share anyway.

If you want to do it your way, do it like this:

void date::initialise(const int d, const int m, const int y, const int
ora, const int mi, const int se)
{
day_ = d;
month_ = m;
year_ = y;

secondo_ = se;
minuto_ = mi;
ora_ = ora;
//any checking?
}

date::date()
{
initialise(0,0,0,0,0,0);
}

date::date(const int d, const int m, const int y, const int ora, const
int mi, const int se)
{
initialise(d, m, y, ora, mi, se);
}

but for the level of code sharing involved, it doesn't seem worth it.

Tom
 
Reply With Quote
 
Karl Heinz Buchegger
Guest
Posts: n/a
 
      06-25-2003


Patrick Kowalzick wrote:
>
>
> An answer to your question. Every call of a constructor instanciates an
> object. So calling the constructor twice should create two objects. While
> this makes no sense it is forbidden to call a constructor from a
> constructor. (95% sure )


Strictly speaking this is not correct. In fact you can't call
a constructor, since a constructor is a function with no name.

It is the other way round: Whenever you create an object, a
constructor is called.
Therefore the call of the constructor is a side effect of createing
an object, not the other way round.

--
Karl Heinz Buchegger
(E-Mail Removed)
 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      06-25-2003
"Chandra Shekhar Kumar" <(E-Mail Removed)> wrote...
>
> it is possible in C++.


Would you stop making those bogus statements? I can understand
how it may be amusing to you, but it is definitely confusing to
those who expect a correct answer.

It is impossible to _call_ a contstructor. There is no way in
the language to "forward" the construction of the object from one
constructor to another like in Java. If there is some common
code to be executed by both constructors, the best place to put
it is a separate function which will be called by the constructors.

As to the OP's problem, the simplest thing to do is to have one
constructor with all arguments (d,m,y,ora,mi,se) with default
argument values set to 0:

date::date(int d = 0, int m = 0, int y = 0,
int ora = 0, int mi = 0, int se = 0) :
day_(d), month_(m), year_(y),
ora_(ora), minuto_(mi), secondo_(se)
{
}

> the only thing imp here is what do u want to do with this....
> i think u want to keep the date(const int d, const int m, const int y,

const
> int ora, ...) as private so the client can't use it directly...and then u

want
> to have a public date() which calls the above private stuff with some

specific
> values.....
>
> > why definition of two constructors like these is not possible in c++???
> >
> > -----------------------
> > date::date(const int d, const int m, const int y, const int ora, const

int
> > mi, const int se){
> > day_ = d;
> > month_ = m;
> > year_ = y;
> >
> > secondo_ = se;
> > minuto_ = mi;
> > ora_ = ora;
> > }
> >
> > date::date(){ date(0,0,0,0,0,0); }
> >

>



 
Reply With Quote
 
Ron Natalie
Guest
Posts: n/a
 
      06-25-2003

"Chandra Shekhar Kumar" <(E-Mail Removed)> wrote in message news:(E-Mail Removed)...
>
> it is possible in C++.


It is NOT possible in C++.

> i think u want to keep the date(const int d, const int m, const int y, const
> int ora, ...) as private so the client can't use it directly...and then u want
> to have a public date() which calls the above private stuff with some specific
> values.....


What makes you think he wants to do that.

> > date::date(){ date(0,0,0,0,0,0); }
> >

>

This does not call the constructor. You can NOT call constructors at all.
The syntax above that appears to be a call is the creation of a temporary date
object in a simple expression that ceases to be at the end of the statement.
It insidiously compiles, but does nothing.


 
Reply With Quote
 
Giulio
Guest
Posts: n/a
 
      06-25-2003
thanx to all for the exhaustive answers, in the future I'll use separate
functions used as constructors -init(...)- in this case because there are
only two constructors for class date I'll leave them separate.

this is a great NG
Giulio


 
Reply With Quote
 
tom_usenet
Guest
Posts: n/a
 
      06-25-2003
On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
(E-Mail Removed)> wrote:

>why definition of two constructors like these is not possible in c++???
>
>-----------------------
>date::date(const int d, const int m, const int y, const int ora, const int
>mi, const int se){
> day_ = d;
> month_ = m;
> year_ = y;
>
> secondo_ = se;
> minuto_ = mi;
> ora_ = ora;
>}
>
>date::date(){ date(0,0,0,0,0,0); }


Ahh, I forgot the super hacky, completely illegal solution:

date::date(){
new (this) date(0,0,0,0,0,0);
}

It will probably work though!

Tom
 
Reply With Quote
 
Patrick Kowalzick
Guest
Posts: n/a
 
      06-25-2003
> >. (95% sure )
>
> Strictly speaking this is not correct.


These are the famous outliers. I wanted to write 99% first. PUH

Thanks
Patrick


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
A constructor calling another constructor (default constructor)? Generic Usenet Account C++ 10 11-28-2007 04:12 AM
findcontrol("PlaceHolderPrice") why why why why why why why why why why why Mr. SweatyFinger ASP .Net 2 12-02-2006 03:46 PM
Calling another constructor from a constructor Asfand Yar Qazi C++ 6 05-17-2004 03:16 PM
java like constructor calling constructor lallous C++ 5 01-23-2004 11:52 PM
calling a constructor within a constructor Brett Irving C++ 3 06-29-2003 10:43 AM



Advertisments