الحد من التعليمات البرمجية بين المشغل = والنسخ المنشئ

StackOverflow https://stackoverflow.com/questions/1477145

سؤال

لدي فئة تتطلب منشئ نسخ غير افتراضي ومشغل تعيين (يحتوي على قوائم من المؤشرات). هل هناك أي طريقة عامة لتقليل ازدواجية التعليمات البرمجية بين منشئ النسخ ومشغل الواجب؟

هل كانت مفيدة؟

المحلول

لا يوجد "طريقة عامة" لكتابة منشئين النسخ المخصص ومشغلي المهام التي تعمل في جميع الحالات. ولكن هناك مصطلح يسمى "نسخ - - مبادلة":

 class myclass
 {
    ...
 public:
    myclass(myclass const&);

    void swap(myclass & with);

    myclass& operator=(myclass copy) {
        this->swap(copy);
        return *this;
    }

    ...
};

إنه مفيد في حالات كثيرة (ولكن ليس كل). في بعض الأحيان يمكنك أن تفعل أفضل. يمكن أن يكون للمتجه أو سلسلة مهمة أفضل تعزز التخزين المخصص إذا كان كبيرا بما فيه الكفاية.

نصائح أخرى

عامل خارج التعليمات البرمجية المشتركة لوظيفة عضو خاص. مثال بسيط (مفتعل إلى حد ما):

#include <iostream>

class Test
{
public:
  Test(const char* n)
  {
    name = new char[20];
    strcpy(name, n);
  }

  ~Test()
  {
    delete[] name;
  }

  // Copy constructor
  Test(const Test& t)
  {
    std::cout << "In copy constructor.\n";
    MakeDeepCopy(t);
  }

  // Assignment operator
  const Test& operator=(const Test& t)
  {
    std::cout << "In assignment operator.\n";
    MakeDeepCopy(t);
  }

  const char* get_name() const { return name; }

private:
  // Common function where the actual copying happens.
  void MakeDeepCopy(const Test& t)
  {        
    strcpy(name, t.name);
  }

private:
  char* name;
};

int
main()
{
  Test t("vijay");
  Test t2(t); // Calls copy constructor.
  Test t3(""); 
  t3 = t2; // Calls the assignment operator.

  std::cout << t.get_name() << ", " << t2.get_name() << ", " << t3.get_name() << '\n';

  return 0;
}
My &My::operator = (My temp)  // thanks, sellibitze
{
    swap (*this, temp);
    return *this;
}

وتنفيذ متخصص std::swap<> (My &, My &).

كما تم الإشارة بالفعل إلى عدد قليل جدا من الملصقات، وجود مشغل = إنشاء كائن جديد مع منشئ النسخ ثم استخدام المبادلة هو التقنية الشائعة المستخدمة ليس لديك لتكرار الرمز في المشغل =.

ومع ذلك، أريد أن أشير إلى بعض الموالية ومخاونة هذه التقنية لمساعدتك في تحديد ما إذا كان من المناسب.

برو - سلامة الاستثناء

إذا كان لك كائنك متطلبات الموارد التي قد تتسبب في رمي وافتراض أن المبادلة لن ترمي، فإن هذه التقنية توفر الضمان القوي لسلامة الاستثناء (إما الكائن الذي يتم تعيينه قد تم نقله إلى قيمة الكائن الآخر أو أنه لم يتغير).

مخادع بصمة الموارد

مشكلة مع هذه التقنية هي أنه يتطلب إنشاء كائن جديد كامل قبل إصداره القديم. إذا كان جسمك يتطلب الكثير من الموارد، فقد يكون هذا مشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top