کپی کردن یک شی از کلاس QObject



  • p{direction:rtl;text-align:right;}. سلام بچه ها

    p{direction:rtl;text-align:right;}. همینطور که همه میدونید کلاس QObject به دلیل یه سری مسائل مربوط یه meta-object متدهای copy constructor and copy assignment را غیر فعال کرده است. حال این سوال مطرحه که چه راه حلی برای کپی گرفتن از شی ایی که از QObject مشتق شده است پیشنهاد میکنید؟ فرض کنید نوشتن یه متد مثل clone به دلیل وجود propertyهای زیاد سخت باشه!!!

    "QtExperts":http://www.qte.ir/?ref=53708be3da7e53e0c7a42c78cc010039



  • p{direction:rtl;text-align:right;}. حتی اگر copyconstructor رو هم باز میذاشت به دردت نمیخورد چون copyconstructor یه bitwise copy انجام میده و فکر نمیکنم همون چیزی باشه که تو بخوای.

    p{direction:rtl;text-align:right;}. به نظر من حتی اگر کلاسی هم مشتق بشه بازم همون مشکلات رو خواهد داشت. بخاطر همین بهترین راه اینه که یک فانکشن clone بسازی و یک شیء جدید ایجاد کنی و دونه دونه مقادیر رو بهش set کنی. در غیر اینصورت حتی اگه deep copy هم باشه بازم مطمئنم که مشکلات خواهد داشت.

    "QtExperts":http://www.qte.ir/?ref=a335c06427c28f59cd09e729197f1ffd



  • p{direction:rtl;text-align:right;}. ممنون محسن جان :)

    "QtExperts":http://www.qte.ir/?ref=dae2de426bec07048213b8e3c52d6240



  • p{direction:rtl;text-align:right;}. اپراتور کپی و سازندهٔ کپی به‌خاطر تعریف ماکروی Q_DISABLE_COPY به‌شکل private تعریف میشن. این ماکرو خودش توسط ماکروی Q_OBJECT تعریف میشه.

    p{direction:rtl;text-align:right;}. این به این معنی نیست که کلاس‌های مشتق‌شده از QObject کپی نداشته باشن. در واقع تمامی کلاس‌های داخلی کیوت، اپراتور = و copy constructor رو به صورت private تعریف کردن. این به این معنی نیست که هر کلاس مشتق شده از QObject که ماکروی Q_OBJECT رو پیاده کرده، مجبور باشه سازندهٔ کپی‌ش رو به صورت خصوصی اعلان کنه.
    مثلا:

    @
    class QOBJ : public QObject
    {
    Q_OBJECT
    public:
    explicit QOBJ(QObject *parent = 0);
    QOBJ(const QOBJ& other);
    };

    QOBJ::QOBJ(const QOBJ &other):
    QObject(other.parent())
    {
    }

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    QOBJ x;
    QOBJ y(x);

    return a.exec();
    

    }
    @

    p{direction:rtl;text-align:right;}. به‌خوبی کامپایل میشه و کار می‌کنه. مشکل اینه که یه این کار از نظر طراحی درست نیست. وقتی داخل کد چیزی شبیه x=y; فراخوانی میشه، چه بلایی سر سیگنال‌ها و اسلات‌های x و y میاد؟ فرض کلی در این مورد وجود نداره. مخصوصا وقتی وراثت در میان باشه. کلاس‌های QObject به هیچ وجه کلاس‌های داده نیستن. نباید برای این استفاده ازشون مشتق کرد. تنها در صورتی اشتقاق از QObject و پیاده‌سازی ماکروی Q_OBJECT لازمه که بخوایم از سیگنال‌ها و اسلات‌ها استفاده کنیم. وقتی می‌خوایم از سیگنال و اسلات استفاده کنیم، کپی کردن زیاد معنی پیدا نمی‌کنه.
    با همهٔ این‌ها بازم پیاده‌سازی کپی (چه به صورت اپراتور، چه به صورت تابع) مشکل ساختاری نداره.

    [quote author="Mohsen" date="1371445484"]p{direction:rtl;text-align:right;}. حتی اگر copyconstructor رو هم باز میذاشت به دردت نمیخورد چون copyconstructor یه bitwise copy انجام میده و فکر نمیکنم همون چیزی باشه که تو بخوای.
    [/quote]

    p{direction:rtl;text-align:right;}. bitwise copy چیه؟



  • p{direction:rtl;text-align:right;}. توی bitwise copy پوینتر ها فقط آدرسشون کپی میشه نه اینکه کل آبجکت.

    "QtExperts":http://www.qte.ir/?ref=16ea7c9a902c2117dce2cafa1402f380



  • [quote author="Mohsen" date="1371528144"]p{direction:rtl;text-align:right;}. توی bitwise copy پوینتر ها فقط آدرسشون کپی میشه نه اینکه کل آبجکت.

    "QtExperts":http://www.qte.ir/?ref=16ea7c9a902c2117dce2cafa1402f380[/quote]

    p{direction:rtl;text-align:right;}. آها :D ما بهش میگیم Shallow copy
    "+":http://en.wikipedia.org/wiki/Object_copy#Shallow_copy



  • p{direction:rtl;text-align:right;}. آره همونه !http://www.qtexperts.ir/stable/smiley/curl-lip.png(Curl Lip)!

    "QtExperts":http://www.qte.ir/?ref=93783489d54768341c97598df2cd1e0e



  • p{direction:rtl;text-align:right;}. ممنون بچه ها از مطالب خوبتون :)

    "QtExperts":http://www.qte.ir/?ref=27be224c9da52d888dee6cf02b43d6b5


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.