C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

why it's not possible calling constructor from constructor?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
Giulio
Guest





PostPosted: Wed Jun 25, 2003 9:42 am    Post subject: why it's not possible calling constructor from constructor? Reply with quote



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




Back to top
Patrick Kowalzick
Guest





PostPosted: Wed Jun 25, 2003 10:03 am    Post subject: Re: why it's not possible calling constructor from construct Reply with quote



Quote:
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



Back to top
Simon Saunders
Guest





PostPosted: Wed Jun 25, 2003 10:10 am    Post subject: Re: why it's not possible calling constructor from construct Reply with quote



"Giulio" <giulio.gL E V [email]A (AT) email (DOT) it[/email]> wrote

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



Back to top
tom_usenet
Guest





PostPosted: Wed Jun 25, 2003 10:41 am    Post subject: Re: why it's not possible calling constructor from construct Reply with quote

On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
[email]A (AT) email (DOT) it[/email]> wrote:

Quote:
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.

Quote:

-----------------------
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)
{
}


Quote:
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

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Jun 25, 2003 11:54 am    Post subject: Re: why it's not possible calling constructor from construct Reply with quote



Patrick Kowalzick wrote:
Quote:


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

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
[email]kbuchegg (AT) gascad (DOT) at[/email]

Back to top
Victor Bazarov
Guest





PostPosted: Wed Jun 25, 2003 1:39 pm    Post subject: Re: why it's not possible calling constructor from construct Reply with quote

"Chandra Shekhar Kumar" <chandra.kumar (AT) oracle (DOT) com> wrote...
Quote:

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)
{
}

Quote:
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); }





Back to top
Ron Natalie
Guest





PostPosted: Wed Jun 25, 2003 2:53 pm    Post subject: Re: why it's not possible calling constructor from construct Reply with quote


"Chandra Shekhar Kumar" <chandra.kumar (AT) oracle (DOT) com> wrote

Quote:

it is possible in C++.

It is NOT possible in C++.

Quote:
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.

Quote:
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.



Back to top
Giulio
Guest





PostPosted: Wed Jun 25, 2003 3:30 pm    Post subject: Re: why it's not possible calling constructor from construct Reply with quote

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


Back to top
tom_usenet
Guest





PostPosted: Wed Jun 25, 2003 3:40 pm    Post subject: Re: why it's not possible calling constructor from construct Reply with quote

On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
[email]A (AT) email (DOT) it[/email]> wrote:

Quote:
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

Back to top
Patrick Kowalzick
Guest





PostPosted: Wed Jun 25, 2003 3:56 pm    Post subject: Re: why it's not possible calling constructor from construct Reply with quote

Quote:
. (95% sure Wink )

Strictly speaking this is not correct.

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

Thanks
Patrick



Back to top
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
 


Powered by phpBB © 2001, 2006 phpBB Group