why it's not possible calling constructor from constructor?

G

Giulio

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); }
 
P

Patrick Kowalzick

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
 
S

Simon Saunders

Giulio said:
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;
}
 
T

tom_usenet

On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
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
 
K

Karl Heinz Buchegger

Patrick said:
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.
 
V

Victor Bazarov

Chandra Shekhar Kumar said:
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)
{
}
 
R

Ron Natalie

Chandra Shekhar Kumar said:
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.
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.
 
G

Giulio

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
 
T

tom_usenet

On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
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
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,007
Latest member
obedient dusk

Latest Threads

Top