c++ - مترجمة - لغة البايثون والهكر pdf




كت: هل يمكن تكوين الكائنات الفرعية في كائنها الأم؟ (5)

في كيو تي، يمكنني تضمين الحاجيات الطفل في والديهم عن طريق تكوين، أو لا بد لي من خلق لهم مع new ؟

class MyWindow : public QMainWindow
{
    ...
private:
    QPushButton myButton;
}

MyWindow::MyWindow ()
 : mybutton("Do Something", this)
{
   ...
}

وتقول الوثائق إن أي كائن مشتق من QObject سوف QObject تلقائيا عندما يتم تدمير والده؛ وهذا يعني دعوة delete ، وهيه في المثال أعلاه سوف تحطم.

هل يتعين علي استخدام ما يلي؟

QPushButton* myButton;

myButton = new QPushButton("Do Something", this);

تصحيح

الأجوبة متنوعة جدا، وتغلي أساسا إلى ثلاثة احتمالات:

  • نعم ، تكوين على ما يرام. يمكن أن تعرف كيو تي كيف تم تخصيص الكائن وفقط delete كائنات كومة الذاكرة المؤقتة (كيف يعمل هذا؟)
  • نعم ، التكوين على ما يرام، ولكن لا تحدد أحد الوالدين، حيث أن الوالد سوف يدعو خلاف ذلك delete على الكائن (ولكن لن تتحول القطعة الوالدين أقل إلى نافذة المستوى الأعلى؟)
  • لا ، الحاجيات دائما أن تكون كومة الذاكرة المؤقتة.

أي واحد هو الصحيح؟


وتقول الوثائق إن أي كائن مشتق من كوبجيكت سوف يتلف تلقائيا عندما يتم تدمير والده؛ وهذا يعني دعوة لحذف

لا. إنه ينطوي على دعوة لمدمر ذلك الكيان المعين.

قل في المثال الخاص بك، إذا تم تدمير MyWindow ، فهذا يعني أن MyWindow من MyWindow قد دعا. والتي بدورها سوف ندعو QPushButton الذي تم تنفيذه بالفعل في QPushButton .

إذا كان لديك كيان مركب، فقط سيتم استدعاء ديستروكتور على هذا الكيان ولكن ليس delete وحتى انها لن تعطل.

علاقات الطفل الأم في كيو تي لا تتطلب على وجه التحديد أن تكون في كومة أو كومة. يمكن أن يكون في أي شيء.

وهناك مثال مماثل في علاقة الطفل الأم فوق كومة هو أكثر من هنا .

HTH ..


سيتم تدمير الكائن فقط عندما يكون لديه مؤشر الأصل، بحيث يمكنك استخدام:

MyWindow::MyWindow ()
 : mybutton("Do Something", 0)
{
   ...
}

واسمحوا لي أن أقتبس من المصدر هنا.

816 QObject::~QObject()
817 {
818     Q_D(QObject);
819     d->wasDeleted = true;
820     d->blockSig = 0; // unblock signals so we always emit destroyed()
821 
   ...
924 
925     if (!d->children.isEmpty())
926         d->deleteChildren();
927 
928     qt_removeObject(this);
929 
930     if (d->parent)        // remove it from parent object
931         d->setParent_helper(0);
932 
933 #ifdef QT_JAMBI_BUILD
934     if (d->inEventHandler) {
935         qWarning("QObject: Do not delete object, '%s', during its event handler!",
936                  objectName().isNull() ? "unnamed" : qPrintable(objectName()));
937     }
938 #endif
939 }

    ...

1897 void QObjectPrivate::deleteChildren()
1898 {
1899     const bool reallyWasDeleted = wasDeleted;
1900     wasDeleted = true;
1901     // delete children objects
1902     // don't use qDeleteAll as the destructor of the child might
1903     // delete siblings
1904     for (int i = 0; i < children.count(); ++i) {
1905         currentChildBeingDeleted = children.at(i);
1906         children[i] = 0;
1907         delete currentChildBeingDeleted;
1908     }
1909     children.clear();
1910     currentChildBeingDeleted = 0;
1911     wasDeleted = reallyWasDeleted;
1912 }

حتى تستطيع أن ترى، QObject الواقع delete كل من أطفالها في QObject . وبالإضافة إلى ذلك، يتم تنفيذ ديستروكتور قبل المدمرات من أي عضو؛ لذلك إذا كان المركب المعني يساوي الوالد - ثم العضو QObject لن يكون لديها أي فرصة لإزالة نفسها من قائمة الأطفال من والدها.

هذا، لسوء الحظ، يعني أنه لا يمكنك إنشاء QObject في الأصل . ولكن يمكنك تكوين في كائنات أخرى، فضلا عن تخصيص على كومة - بمجرد ضمان تدمير الكائن أو إعادة تعيين الأم إلى 0 قبل بدء الوالد تدمير.


يتم حذف متغيرات عضو غير ثابت، غير كومة عندما يبدأ تسلسل حذف كائن معين. فقط عندما يتم حذف جميع الأعضاء، وسوف تذهب إلى ديستروكتور من الطبقة الأساسية. ومن ثم سيتم حذف عضو ميبوتون كبوشبوتون قبل ~ كمينويندو () يسمى. ومن وثائق كوبجيكت: "إذا قمنا بحذف كائن طفل قبل والده، فإن كيو تي سيقوم تلقائيا بإزالة هذا الكائن من قائمة الأطفال الأصل". وبالتالي لن يحدث تحطم.


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

من ناحية أخرى عندما يتم إنشاء الكائن الطفل على المكدس ترتيب الدمار مهم. سيتم تدمير الطفل قبل والده، وسوف يزيل نفسه من قائمة والده بحيث لا يسمى المدمر مرتين.

وهناك أيضا مثال في ذلك الارتباط يبين النظام المثير للإتلاف.







qobject