الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال ..le constructeur de copie

بدأه yacinebrca في 10 يوليو 2014 · 3 رد · 736 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

 السلام عليكم ...

 

اخواني اريد ان أسالكم عن شيئ  تعقد علي بعض الشيء  ... :angry: :angry:

 

أولا اليكم الكود :

#include<iostream>
#include<cstdlib>

using namespace std ;
/* .....................................  */
class Rectangle
{
  double* largeur ;
  double* hauteur ;

  public :
      Rectangle(double l ,double h )
      :
          largeur( new double (l) )
      ,
          hauteur( new double (h) )
      {}
     ~Rectangle();
     double get_l(){ return *largeur ;}
     double get_h(){ return *hauteur ;}
};
/* ............................................*/
 Rectangle :: ~Rectangle()
 {
     delete hauteur;
     delete largeur;
 }
/* ....................... */
 void affiche( Rectangle tmp )
 {
     cout<<" hauteur : "
         << tmp.get_h()
         <<"\n largeur : "
         << tmp.get_l()
         <<endl;
 }
/* .....................*/
int main(){

  Rectangle r(3.0,4.0);
  affiche(r);

  cout<<"\n\n";

  cout<<" hauteur : "<<r.get_h();
  cout<<" largeur : "<<r.get_l();

 return 0;
}

 . خلال الكود لم أدرج le constructeur de copie ...

بل سيكون الدور  Le constructeur de copie par défaut .

 

المشكل هو .. بما انني لم اعرف constructeur de copie فسيحدث مشكل عند تطبيق  هذا الكود  ..

 cout<<" hauteur : "<<r.get_h();
  cout<<" largeur : "<<r.get_l();

لأن المتغير tmp  والذي هو وسيط ..للدالة الطباعة .. سيحمل نفس addrasee  الذي يحملها الكائن r ...

 

اليكم الصورة . فأنا لا احسن التعبير ..

 

410010846.png

 

 

 من خلال الصوة  .. نرى عند انتعاء البرنامج من تنفيذ دالة الطباعة فانه يقوم بعملية delete ... للمتغير tmp  ...

 

 

 

اليكم صورة أخرى لتقريب أكثر  ... ;)

 

503871569.png

 

 

اذا بهذا فان الكائن r سيفقد كل من قيمة  ..الخصائص ..وهما (hauteur / largeur ..) ..

 

 

لكن لم افهم لماذا عند تنفيذ البرنامج   ... تكون النتيجة  :D  :D  ...

 

838222316.png

 

 

 

 

  ..... أما انا مخطئ في تفسير ما يحدث خلال تنفيذ البرنامج  .. :blush: :blush: ..

 

 

أرجوا ان لا تبخلوا علينا  بردودكم   ...

 

 

وبارك الله فيكم  ... :)

elearning_image.jpg

#2

 اظن ان أعضاء المنتدى بقضون صومين صوم رمضان وصوم عن كتابة الاجابات  ...


 


تقبل الله صيامكم ... وشكرا


elearning_image.jpg

#3

السلام عليكم

اقتباس

 

لأن المتغير tmp  والذي هو وسيط ..للدالة الطباعة .. سيحمل نفس addrasee  الذي يحملها الكائن r ..

 

المتغير tmp يحتوي على نسخة من الكائن r وليس الكائن نفسه

 

فإذا أجريت أي تغييرات على tmp داخل الدالة  فالكائن r لن يتأثر بهذه التغييرات لأنك قمت بتمرير الكائن بالقيمة و ليس المرجع

#4

أخي .. أولا شكرا لك  ...

 

بنسبة للردك ... قأظنك لم تفهم سؤالي جيدااا ...

 

المشكل الذي طرحته هل في عدم كتابتي (le constructeur de copie .) يؤثر على مسار البرنامج  ...

فقد قرات انه اذا تم تعريف خصائص من نوع المؤشرات ولم نستخدمle constructeur de copie .

فانه يحدث مشاكل وتخدث أخطاء ...

 

فأردت ان اجرب فكتبت برنامج يخلو const copie ولم تحدث معي مشاكل ففي الاخير رأينا كيف طبعت النتائج من دون أخطاء

-------------

 

أخي خلال هذا الكود يتضح لي انه هو المشكل ...

affiche(r);

لانني لم اعرف  ...

 Rectangle :: Rectangle( Rectangle const& tmp ):
     largeur( new double  (*(tmp.largeur))  ),
     hauteur( new double  (*(tmp.hauteur))  )
     {}

وهذا هو الذي يسمح للكائن tmp بأن يصنع لنفسه نسخة بعيدة عن الكائن r

 largeur( new double  (*(tmp.largeur))  )

اي بهذا الشكل يكود التنفيذ   ...

 

850434127.png

 

 

وأظنك هذا الذي كنت تقصده  ...

 

لكن هذا يحدث خلال تعريف( le constructeur de copie) وانا لم اعرفه اي لم أكتبه ...

 

اذا  سيكون الدور على  Le constructeur de copie par défaut

 

 

وهنا المشكل لانني قمت بتعريف الخصائص .(les attributs). مؤشرات ...

class Rectangle
{
  double* largeur ;
  double* hauteur ;
...
...
};

 قالمشكل ان كل من tmp و r يؤشران على نفس المكان في الذاكرة  ..

لان كما قلت سابقا الكائن tmp ينقصه

 largeur( new double  (*(tmp.largeur))  )

فلم يتم حجز مكان في الذاكرة للكل من قيم attribut ...

اذا هو سيشير لنفس الكائن r  ...

 

لكن هذا مشكل  ..

 

لأننا كما نعلم انه عندما الانتهاء الدالة affiche

/* ....................... */
 void affiche( Rectangle tmp )
 {
     cout<<" hauteur : "
         << tmp.get_h()
         <<"\n largeur : "
         << tmp.get_l()
         <<endl;
 }
/* .....................*/

سبحدث تحرير للذاكرة  . بالنسبة للمتغيرات المعرفة بداخلها . ( delete )

 

وهذا يتسبب في خلق مشكل للكائن r  ...حيث يفقده قيم الخصائص التي يشير عليها وهي    hauteur largeur

 

...........................................

 

أتمنى ان اكون قد وفقت في ان اوصل لك معنى الاشكال الواقع ... :mellow: 
 

elearning_image.jpg

مواضيع مشابهة