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); }
     
    Giulio, Jun 25, 2003
    #1
    1. Advertisements

  2. class date {
    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. Advertisements

  3. 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
    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.
    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()
    :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. 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, Jun 25, 2003
    #5
  6. 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)
    {
    }
     
    Victor Bazarov, Jun 25, 2003
    #6
  7. Giulio

    Ron Natalie Guest

    It is NOT possible in C++.
    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.
     
    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
    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 ;-) )
    These are the famous outliers. I wanted to write 99% first. PUH ;-)

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

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 (here). After that, you can post your question and our members will help you out.