ما هي الطريقة الصحيحة لتهيئة عضو ثابت من نوع "T&" في فصل دراسي؟

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

سؤال

أنا ألعب مع فئة مفردة حريصة على التغذية. الفكرة هي أنك ترث علنًا من الفصل مثل ذلك:

class foo : public singleton<foo> { };

لقد تعلمت الكثير في هذه العملية ، لكنني عالق الآن لأنه يكسر رابط Visual Studio 2008. المشكلة هي مع عضو مثيل ثابت و/أو تهيئته.

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T & instance;
};
template<class T> T & T::instance;

أي رؤية سيكون موضع تقدير كبير!

تعديل:

مع هذا الإعلان الطبقي ...

template<class T>
class singleton {
    singleton();
    singleton(singleton const &);
    singleton & operator = (singleton const &);
public:
    static T instance;
};
template <class T> T singleton<T>::instance;

عندما أحاول القيام بذلك ...

class foo : public singleton<foo> { };

أحصل على هذا الخطأ ...

خطأ C2248: "Singleton :: Singleton": لا يمكن الوصول إلى عضو خاص معلن في الفصل "Singleton"

...

حدث هذا التشخيص في الوظيفة التي تم إنشاؤها في برنامج التحويل البرمجي "Foo :: Foo (void)"

تفسيري هو أن Singleton يريد بناء كائن FOO الذي يعتمد ، حسب الميراث ، على بناء مفردة يكون مُنشئها خاصًا. كنت أحسب أن تمكن Singleton من الوصول إلى مُنشئها ولكن لا أعتقد ذلك. أيه أفكار؟

تحرير 2:

لقد أدركت أن نهج الوراثة من singleton<T> لديه مشكلة طلب التغيير في الفصل لاستخدامه كفرد. لقد انتهى بي الأمر مع الكود التالي لقالب فئة Singleton المتحمس.

template<typename T>
class singleton_wrapper {
    singleton_wrapper();
    singleton_wrapper(singleton_wrapper const &);
    singleton_wrapper & operator = (singleton_wrapper const &);
    static T instance;
    template<typename T> friend T & singleton();
};
template<typename T> T singleton_wrapper<T>::instance;

template<typename T>
T & singleton() {
    return singleton_wrapper<T>::instance;
}

للصف...

class foo {
public:
    void bar() { }
};

... يمكن للمرء الوصول إلى مثيل واحد منه (تم تهيئته قبل Main ()) باستخدام ما يلي:

singleton<foo>().bar();

شكرا مرة أخرى على المساعدة ، وخاصة GMAN. أنا سعيد جدًا بتجربتي الأولى على Stackالفائض.

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

المحلول

لا يمكنك ذلك ، نظرًا لأنه ليس لديك مثيل ملموس. يمكنك أن تحتاج إلى إنشاء مثيل فعلي يمكنك الرجوع إليه:

template <class T>
class singleton {
    ...
private:
    static T instance_;
public:
    static T& instance;
};
template <class T> T singleton<T>::instance_;
template <class T> T& singleton<T>::instance = singleton<T>::instance;

أو أكثر بكل بساطة ، فقط تخلص من الإشارة تمامًا:

template <class T>
class singleton {
    ...
public:
    static T instance;
};
template <class T> T singleton<T>::instance;

نصائح أخرى

خارج الأكمام: قم بتغيير المثيل ليكون من النوع "T" بدلاً من "T &".

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