Sunday 29 December 2019

Can I call a constructor from another constructor (do constructor chaining) in C++?



As a C# developer I'm used to run through constructors:






class Test {
public Test() {
DoSomething();
}

public Test(int count) : this() {
DoSomethingWithCount(count);

}

public Test(int count, string name) : this(count) {
DoSomethingWithName(name);
}
}


Is there a way to do this in C++?




I tried calling the Class name and using the 'this' keyword, but both fails.


Answer



C++11: Yes!



C++11 and onwards has this same feature (called delegating constructors).



The syntax is slightly different from C#:



class Foo {
public:

Foo(char x, int y) {}
Foo(int y) : Foo('a', y) {}
};


C++03: No



Unfortunately, there's no way to do this in C++03, but there are two ways of simulating this:





  1. You can combine two (or more) constructors via default parameters:



    class Foo {
    public:
    Foo(char x, int y=0); // combines two constructors (char) and (char, int)
    // ...
    };

  2. Use an init method to share common code:




    class Foo {
    public:
    Foo(char x);
    Foo(char x, int y);
    // ...
    private:
    void init(char x, int y);
    };

    Foo::Foo(char x)

    {
    init(x, int(x) + 7);
    // ...
    }

    Foo::Foo(char x, int y)
    {
    init(x, y);
    // ...
    }


    void Foo::init(char x, int y)
    {
    // ...
    }



See the C++FAQ entry for reference.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...