سؤال

لقد كنت أعمل مؤخرًا مع التعليمات البرمجية التي تبدو هكذا:

using namespace std;

class Singleton {
    public:
        static Singleton& getInstance();
        int val;
};

Singleton &Singleton::getInstance() {
    static Singleton s;
    return s;
}

class Test {
    public:
        Test(Singleton &singleton1);
};

Test::Test(Singleton &singleton1) {
    Singleton singleton2 = Singleton::getInstance();
    singleton2.val = 1;
    if(singleton1.val == singleton2.val) {
        cout << "Match\n";
    } else {
        cout << "No Match " << singleton1.val << " - " << singleton2.val << "\n";
    }   
}

int main() {
    Singleton singleton = Singleton::getInstance();
    singleton.val = 2;
    Test t(singleton);
}

في كل مرة أقوم بتشغيلها ، أحصل على "لا تطابق". ومع ذلك ، أتوقع مباراة حيث يجب أن يكون هناك حالة واحدة فقط من الفصل. من ما يمكنني قوله عند التنقل مع GDB هو أن هناك حالتان من المفرد. لماذا هذا؟

هل كانت مفيدة؟

المحلول

السطر الأول من الاختبار :: يخلق اختبار آخر من المفرد (على المكدس ، محليك ليس مرجعا). يمكنك منع ذلك من خلال تحديد المُنشئ الافتراضي على Singleton وجعله خاصًا. كما هو الحال ، يمكن لأي شخص إنشاء مثيل من Singleton.

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