12.8 Overlapping and delegating constructors

주홍영·2022년 3월 17일
0

Learncpp.com

목록 보기
132/199

https://www.learncpp.com/cpp-tutorial/overlapping-and-delegating-constructors/

constructor에서 overlapping functionality를 구현하려면 어떻게 해야할까?

The obvious solution doesn’t work

class Foo
{
public:
    Foo()
    {
        // code to do A
    }

    Foo(int value)
    {
        Foo(); // use the above constructor to do A (doesn't work)
        // code to do B
    }
};

위와 같이 하는 방법은 그럴싸 하지만 작동하지 않는다

Delegating constructors

class Foo
{
private:

public:
    Foo()
    {
        // code to do A
    }

    Foo(int value): Foo{} // use Foo() default constructor to do A
    {
        // code to do B
    }

};

member init list에서 호출하는 것은 가능하다
이를 delegating constructor라고 한다 (delegate 위임하다)

여기 다른 예시다

#include <string>
#include <iostream>

class Employee
{
private:
    int m_id{};
    std::string m_name{};

public:
    Employee(int id=0, const std::string &name=""):
        m_id{ id }, m_name{ name }
    {
        std::cout << "Employee " << m_name << " created.\n";
    }

    // Use a delegating constructor to minimize redundant code
    Employee(const std::string &name) : Employee{ 0, name }
    { }
};

Resetting class

default 값으로 class를 다시 되돌리고 싶으면 아래와 같이 할 수 있다

#include <iostream>

class Foo
{
private:
    int m_a{ 5 };
    int m_b{ 6 };


public:
    Foo()
    {
    }

    Foo(int a, int b)
        : m_a{ a }, m_b{ b }
    {
    }

    void print()
    {
        std::cout << m_a << ' ' << m_b << '\n';
    }

    void reset()
    {
        *this = Foo(); // create new Foo object, then use assignment to overwrite our implicit object
    }
};

int main()
{
    Foo a{ 1, 2 };
    a.reset();

    a.print();

    return 0;
}
profile
청룡동거주민

0개의 댓글