https://www.learncpp.com/cpp-tutorial/overlapping-and-delegating-constructors/
constructor에서 overlapping functionality를 구현하려면 어떻게 해야할까?
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
}
};
위와 같이 하는 방법은 그럴싸 하지만 작동하지 않는다
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 }
{ }
};
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;
}