another bloody basic question

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • jesse

    another bloody basic question

    In java, one constructor can call another constructor through this(...)

    for instance

    class foo
    {
    public:
    foo(int k) { this(k,false)};
    foo(int k, boolean m){...};
    }

    It seems i can't find similar syntax in c++.
    what is the notion for one constructor to call another?

    sorry for this bloody basic question.

    jesse

  • Janusz Szpilewski

    #2
    Re: another bloody basic question

    jesse wrote:
    [color=blue]
    > what is the notion for one constructor to call another?
    >[/color]

    The short answer is you cannot do it directly. Take a look at:


    I think bookmarking the entire FAQ would be a good idea.

    Regards,
    Janusz

    Comment

    • Andrey Tarasevich

      #3
      Re: another bloody basic question

      jesse wrote:
      [color=blue]
      > In java, one constructor can call another constructor through this(...)
      >
      > for instance
      >
      > class foo
      > {
      > public:
      > foo(int k) { this(k,false)};
      > foo(int k, boolean m){...};
      > }
      >
      > It seems i can't find similar syntax in c++.
      > what is the notion for one constructor to call another?
      >
      > sorry for this bloody basic question.
      > ...[/color]

      There's no such syntax in C++. In some cases the common code can be
      transferred from constructors to a separate function (regular function,
      not a constructor), which then can be called from all constructors. In
      other cases there is no other way but to repeat the same code in all
      constructors.

      --
      Best regards,
      Andrey Tarasevich

      Comment

      • tom_usenet

        #4
        Re: another bloody basic question

        On Wed, 05 Nov 2003 18:12:54 -0800, jesse <jessezx@yahoo. com> wrote:
        [color=blue]
        >In java, one constructor can call another constructor through this(...)
        >
        >for instance
        >
        >class foo
        >{
        >public:
        > foo(int k) { this(k,false)};
        > foo(int k, boolean m){...};
        >}
        >
        >It seems i can't find similar syntax in c++.
        >what is the notion for one constructor to call another?
        >
        >sorry for this bloody basic question.[/color]

        Basically you can't. The C++ construction model is very different to
        Javas. By the time you enter the {} part of your constructor, all base
        classes and all member variables have already been constructed. This
        is because of the existence of user-defined value types, a concept
        that Java doesn't have.

        Have you come across initializer lists?

        foo(int k)
        :m_k(k)
        {}

        foo(int k, boolean m)
        :m_k(k), m_m(m)
        {}

        With initializer lists, the constructor body is often empty anyway, so
        what is there to share?

        That said, I think a syntax like this has been proposed at some point
        in the past, but I don't think any compiler supports it:

        foo(int k)
        :foo(k, false)
        {
        //anything extra
        }

        Tom

        Comment

        • Nils Petter Vaskinn

          #5
          Re: another bloody basic question

          On Wed, 05 Nov 2003 18:12:54 -0800, jesse wrote:
          [color=blue]
          > In java, one constructor can call another constructor through this(...)
          >
          > for instance
          >
          > class foo
          > {
          > public:
          > foo(int k) { this(k,false)};
          > foo(int k, boolean m){...};
          > }
          >
          > It seems i can't find similar syntax in c++.
          > what is the notion for one constructor to call another?[/color]

          You can make an init() function that is called from the constructors,
          though for your example the simplest would be:

          class Foo {
          public:
          Foo(int k, bool m = false);
          }

          When you call do new Foo(42) the default is used for m since you didn't
          supply a value.

          --
          NPV

          "the large print giveth, and the small print taketh away"
          Tom Waits - Step right up

          Comment

          • Gary Labowitz

            #6
            Re: another bloody basic question

            "tom_usenet " <tom_usenet@hot mail.com> wrote in message
            news:448kqvsu0j a2vesvc5t9c1g2d oorkgkpen@4ax.c om...[color=blue]
            > On Wed, 05 Nov 2003 18:12:54 -0800, jesse <jessezx@yahoo. com> wrote:
            >[color=green]
            > >In java, one constructor can call another constructor through this(...)
            > >
            > >for instance
            > >
            > >class foo
            > >{
            > >public:
            > > foo(int k) { this(k,false)};
            > > foo(int k, boolean m){...};
            > >}
            > >
            > >It seems i can't find similar syntax in c++.
            > >what is the notion for one constructor to call another?
            > >
            > >sorry for this bloody basic question.[/color]
            >
            > Basically you can't. The C++ construction model is very different to
            > Javas. By the time you enter the {} part of your constructor, all base
            > classes and all member variables have already been constructed. This
            > is because of the existence of user-defined value types, a concept
            > that Java doesn't have.
            >
            > Have you come across initializer lists?
            >
            > foo(int k)
            > :m_k(k)
            > {}
            >
            > foo(int k, boolean m)
            > :m_k(k), m_m(m)
            > {}
            >
            > With initializer lists, the constructor body is often empty anyway, so
            > what is there to share?[/color]

            The equivalent in C++ is to use the initializer list to indicate the
            constructor of the base class to be used. It is selected by the normal
            overloading operation.
            Here is a simple example showing construction of a derived class with no,
            one, or two arguments.

            #include <iostream>
            using namespace std;

            class B
            {public:
            int b;
            B( ):b(2){}
            B(int x):b(x){}
            };
            class A : public B
            {public:
            int a;
            A( ):a(1){}
            A(int x):a(x){}
            A(int x, int y):a(x),B(y){}
            };
            int main ( )
            {
            A myA;
            cout <<myA.a<<myA.b< <endl;
            A myA1(3);
            cout<<myA1.a<<m yA1.b<<endl;
            A myA2(4,5);
            cout << myA2.a<<myA2.b< <endl;
            return 0;
            }

            --
            Gary


            Comment

            • Ron Natalie

              #7
              Re: another bloody basic question


              "jesse" <jessezx@yahoo. com> wrote in message news:3FA9AE26.6 070308@yahoo.co m...
              [color=blue]
              > It seems i can't find similar syntax in c++.
              > what is the notion for one constructor to call another?[/color]

              There is no similar syntax in C++. You can't call constructors in C++.
              The cleanest work around is to put the common code in a seperate
              member function and call it from both constructors.


              Comment

              • Ron Natalie

                #8
                Re: another bloody basic question


                "Andrey Tarasevich" <andreytarasevi ch@hotmail.com> wrote in message news:vqjc6lbo6k 3fab@news.super news.com...
                [color=blue]
                >
                > There's no such syntax in C++. In some cases the common code can be
                > transferred from constructors to a separate function (regular function,
                > not a constructor), which then can be called from all constructors. In
                > other cases there is no other way but to repeat the same code in all
                > constructors.[/color]

                There's nothing that ever prevents the constructor body from being
                moved. What's a pain in the butt is that there is no way to share
                the initializer lists between two constructors.


                Comment

                Working...