why it's not possible calling constructor from constructor?

Discussion in 'C++' started by Giulio, Jun 25, 2003.

  1. Giulio

    Giulio Guest

    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
     
    Giulio, Jun 25, 2003
    #1
    1. Advertising

  2. > 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
     
    Patrick Kowalzick, Jun 25, 2003
    #2
    1. Advertising

  3. "Giulio" <giulio.gL E V > wrote in message
    news:c8eKa.39293$...
    > 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;
    }
     
    Simon Saunders, Jun 25, 2003
    #3
  4. Giulio

    tom_usenet Guest

    On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
    > 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
     
    tom_usenet, Jun 25, 2003
    #4
  5. 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
     
    Karl Heinz Buchegger, Jun 25, 2003
    #5
  6. "Chandra Shekhar Kumar" <> 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); }
    > >

    >
     
    Victor Bazarov, Jun 25, 2003
    #6
  7. Giulio

    Ron Natalie Guest

    "Chandra Shekhar Kumar" <> wrote in message news:...
    >
    > 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.
     
    Ron Natalie, Jun 25, 2003
    #7
  8. Giulio

    Giulio Guest

    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
     
    Giulio, Jun 25, 2003
    #8
  9. Giulio

    tom_usenet Guest

    On Wed, 25 Jun 2003 11:42:20 +0200, "Giulio" <giulio.gL E V
    > 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
     
    tom_usenet, Jun 25, 2003
    #9
  10. > >. (95% sure ;-) )
    >
    > Strictly speaking this is not correct.


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

    Thanks
    Patrick
     
    Patrick Kowalzick, Jun 25, 2003
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Brett Irving
    Replies:
    3
    Views:
    3,350
    John Harrison
    Jun 29, 2003
  2. lallous
    Replies:
    5
    Views:
    8,870
    David Harmon
    Jan 23, 2004
  3. Mr. SweatyFinger

    why why why why why

    Mr. SweatyFinger, Nov 28, 2006, in forum: ASP .Net
    Replies:
    4
    Views:
    974
    Mark Rae
    Dec 21, 2006
  4. Mr. SweatyFinger
    Replies:
    2
    Views:
    2,212
    Smokey Grindel
    Dec 2, 2006
  5. Generic Usenet Account
    Replies:
    10
    Views:
    2,340
Loading...

Share This Page