5 Nisan 2020 Pazar

C++11 ile Delegating Constructor

delegating constructor
C++ 11'den önce bir constructor C#'taki gibi bir başka constructor metodunu çağıramazdı. Ancak C++11 ile bu durum değişti. Artık aşağıdaki gibi yapılabiliyor. Eğer derleyicimiz yeni değilse, mecburen ortak bir init() metodu yazmak gerekir.

Örnek
İstenirse std::move bile kullanılabilir. Şöyle yaparız.
SomeClass(const std::string&& _name) : name(_name) {}
SomeClass(const std::string& _name) : SomeClass(std::move(_name)) {}
Örnek
Şöyle yaparız.
ZfooName::ZfooName(int magoo)
    : ZfooName()
 {
    fGoo = magoo;
 }
Faydası Nedir
İki tane büyük faydası var.

1. Default Parametre Tanımlama Sağlaması Faydası
Bence en büyük faydası az parametre alan bir constructor tanımlayarak default parametreler ile çok parametre alan bir başka constructor'ın çağrılabilmesi.
Örnek
Şöyle yaparız. Elimizde 1 ile işaretli constructor olsun. 2 ile işaretli constructor'ı yazarak x parametresini girmekten kurtulmak mümkün.
class Foo {
public: 
  Foo(char x, int y) {...} //1
  Foo(int y) :  //2
    Foo('a', y) {...}
};
Örnek
Şöyle yaparız. Elimizde 2 ile işaretli constructor olsun. 1 ile işaretli constructor'ı yazarak default constructor'a sahip olmak mümkün.
class UDPSocketTest : public SocketTest
{               
public:         
  UDPSocketTest() :  //1
    UDPSocketTest(new SocketPool()) {}

  // You should already have this constructor written:
  UDPSocketTest(SockerPool *p) //2
    SocketTest(p),
    socketPool_(p)
  {
  }                         

  ~UDPSocketTest() {
  }           

private:
  SocketPool* socketPool_;
};
Örnek
Elimizde şöyle bir kod olsun. Burada public constructor, gcd() metodunu çağırarak private constructor metodumuzu tetikler.

int gcd(int a, int b); // Greatest Common Divisor
class Fraction {
public:
  // Call gcd ONCE, and forward the result to another constructor.
  Fraction(int a, int b) : Fraction(a,b,gcd(a,b))
  {
  }
private:
  // This constructor is private, as it is an
  // implementation detail and not part of the public interface.
  Fraction(int a, int b, int g_c_d)
  {
    ...
  }
};
2. Destructor'ın Çağrılmasını Sağlaması Faydası
 Eğer en dıştaki constructor exception atarsa yine destructor çağrılır.
if the non‐delegating constructor for an object has completed execution and a delegating constructor for that object exits with an exception, the object’s destructor will be invoked.
Şöyle yaparız.
X(const A& x, const A& y)
 : X{}
{
...
}

Şu kod default constructor'ın çalışmasını garanti eder
: X{}
Eğer kendi constructor metodum içinde exception atılsa bile destructor metodum çalışır.

Hiç yorum yok:

Yorum Gönder