18 Mart 2019 Pazartesi

Copy Constructor'ın Etkinsizleştirilmesi - Deleted Copy Constructor

Copy Constructor Neden Etkinsizleştirilir
Copy Constructor sınıf içinde private bir pointer varsa, "dangling pointer" oluşturmaktan kaçınmak için etkinsizleştirilebilir.

Copy constructor'ı etkinsizleştirmek için iki yöntem var.

1. Private Copy Constructor
İlkinde metod imzası private tanımlanır ancap .cpp dosyasında metod yazılmaz.
private:
  MyClass(const MyClass& other);
Boost gibi kütüphanlerde şöyle tanımlı.
class noncopyable {
private:
  // This header can be compiled as both C++11 and C++03
  noncopyable(noncopyable const&) DELETED_DEFINITION;
  void operator=(noncopyable const&) DELETED_DEFINITION;
};
2. delete Olarak İşaretli Copy Constructor
Deleted copy constructor public olursa daha iyi. Açıklaması şöyle
By convention, deleted functions are declared public, not private. There’s a reason for that. When client code tries to use a member function, C++ checks accessibility before deleted status. When client code tries to use a deleted private function, some compilers complain only about the function being private, even though the function’s accessibility doesn’t really affect whether it can be used. It’s worth bearing this in mind when revising legacy code to replace private-and-not-defined member functions with deleted ones, because making the new functions public will generally result in better error messages.
Şöyle yaparız.
MyClass(const MyClass& other) = delete;

Hiç yorum yok:

Yorum Gönder