كيفية الحفاظ على صحة ثابت عبر المؤشرات؟

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

  •  26-12-2019
  •  | 
  •  

سؤال

أحاول إجراء عملية const على فئة تكون ثابتة حقًا - فهي لا تغير البيانات التي يشير إليها الفصل.

على سبيل المثال:

class Node{
public:
    int val;
};
class V{
public:
    Node * node; //what is the change that is needed here?
    void const_action()const{
        node->val=5; //error wanted here
    }
    void action(){
        node->val=5; //error is not wanted here
    }
};
هل كانت مفيدة؟

المحلول

يمكنك استخدام قالب لفرض صحة const على مؤشر دون تغيير معنى أو تنفيذ صفك:

giveacodicetagpre.

نصائح أخرى

const بعد أن يقول إعلان الوظيفة أنه لا يُسمح للوظيفة بتغيير أي أعضاء في الفصل (باستثناء تلك التي تم وضع علامة عليها mutable).

نظرًا لأن الكود الخاص بك لا يغير أي عضو في الفصل، بل يغير الكائن فقط node يشير إلى أن كلتا الوظيفتين سيتم تجميعهما.

AFAIK لا توجد طريقة لمنع هذا.إذا قمت بوضع علامة على node const, ، ولن يتم تجميعها.

أنت مربك Node* const ل Node const*.

أحد الآثار الجانبية [المؤسفة؟] لاستخدام المراوغة هنا هو ذلك constإن طبيعة العضو المؤشر لا علاقة لها بالواقع Node التي تعمل عليها.

إذا لم تكن بحاجة إلى أن يكون هذا العضو مؤشرًا، فهذا أمر سهل للغاية:

class V
{
public:
    Node node;

    void const_action() const
    {
        node.val = 5; // error here
    }

    void action()
    {
        node.val = 5; // no error here
    }
};

ومع ذلك، نظرًا لاسمها، أعتقد أن الحياة ليست بهذه البساطة وأنك لم يحالفك الحظ.

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