Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
333 views

Η ερωτηση αφορα την 1η ασκηση της 3ης σειρας, συγκεκριμενα την μεθοδο operator =.

ChessBoardArray & operator = (const ChessBoardArray &a) {
  /*delete [] array;
    priv_size = a.priv_size;             HOW DOES THIS EVEN DO SOMETHING???
    priv_base = a.priv_base;
    array = new int[priv_size*priv_size];

    for (int i=0; i<priv_size*priv_size; i++)
        array[i] = a.array[i];

    return *this;
*/}

Το παραπανω ειναι η υλοποιηση του operator = (τουλαχιστον ετσι νομιζω). Οπως φαινεται ειναι ολοκληρη η υλοποιηση μεσα σε comment. Παρολ΄ αυτα, στην main οριζω εναν πινακα a, τον παρακατω:

   0   0   0   0
   0   0   0   0
   3   0   0   0
   0   0   0   5 

Και χρησιμοποιω τον operator = για να ορισω και εναν ακομα πινακα b, αντιγραφο του a, οπως φαινεται παρακατω:

  cout << a;                 //operator << is used
  cout << endl;
  ChessBoardArray b = a;
  b[1][1] = 39;
  b[3][1] = 2;
  cout << b;
  cout << endl;
  cout << a;

Αυτο παραδοξως λειτουργει και κανει το εξης:

   0   0   0   0
   0   0   0   0
   3   0   0   0
   0   0   0   5

   0   0   0   0
   0  39   0   0
   3   0   0   0
   0   2   0   5

   0   0   0   0
   0   0   0   0
   3   0   0   0
   0   0   0   5

Στο παραδειγμα οχι μονο αντιγραφεται ο πινακας a, αλλα αλλαζω και καποια στοιχεια του b για να αποκλεισω το ενδεχομενο να εχει γινει καποιο λαθος reference στον a, πραγμα που προφανως δεν γινεται, αφου μετα ξανατυπωνω τον a και δεν εχει αλλαξει.

Επειδη ρωτησα ηδη στο Stack Overflow, (https://stackoverflow.com/questions/66959350/operator-problem-why-is-this-happening#comment118359259_66959350)
και ζητηθηκε να κανω edit και να προσθεσω και τον construstor, το εκανα (ελπιζω να μην προκυψει προβλημα "παραθεσης κωδικα" :/).

Εχω αλλαξει τα ονοματα των μεθοδων/μεταβλητων στην ερωτηση στο Stack Overlow, απλα για να μην χρειαστει να παρεχω και παραπανω context και πληροφοριες για το περι τινους προκειται η ολη ερωτηση.

Επισης, το οπως θα δειτε και στον παραπανω συνδεσμο, ακριβως το ιδιο αποτελεσμα εχω οταν βαζω ολοκληρη την μεθοδο σε comment, το οποιο βγαζει ακομα λιγοτερο νοημα (???).

Ευχαριστω.

in progtech by (190 points)
edited by | 333 views

1 Answer

+2 votes
Best answer

Στο παράδειγμα που αναφέρεις καλείται ο copy constructor, όχι ο operator=.
Το να γράψεις ChessBoardArray b = a; είναι το ίδιο με το να γράψεις ChessBoardArray b(a);

Αφήνω εδώ και την σχετική σελίδα από το cppreference: https://en.cppreference.com/w/cpp/language/copy_constructor . Στο Explanation αναφέρει τους τρόπους να καλέσεις τον copy constructor.

by (2.9k points)
selected by

301 questions

289 answers

288 comments

903 users