2011-02-05 32 views

回答

0

@AnonymousCoward

這是從您的解決方案派生而來的。請注意此變體中的初始化/銷燬模式(如果您尚未記住它,請閱讀輸出)。你可以用它來推遲創作,直到訪問,並進行破壞,並在終止(可能爲自定義類型是有用的)自由:

#include <iostream> 
#include <memory> 

class t_custom { 
public: 
    t_custom() { 
     std::cout << "custom ctor: " << __PRETTY_FUNCTION__ << "\n"; 
    } 

    ~t_custom() { 
     std::cout << "custom dtor: " << __PRETTY_FUNCTION__ << "\n"; 
    } 
}; 

template<typename T> 
class Global { 
public: 
    static T* Shared() { 
     std::cout << "enter: " << __PRETTY_FUNCTION__ << "\n"; 
     static std::auto_ptr<T>pVar(new T); 
     std::cout << "access: " << __PRETTY_FUNCTION__ << ":\t\t"; 
     return pVar.get(); 
    } 

private: 
    Global(); 
    ~Global(); 
    Global(const Global& rhs); 
    Global& operator=(const Global& rhs); 
}; 

template<typename T> 
class Global_orig { 
public: 
    static T* const pVar; 
private: 
    Global_orig(); 
    Global_orig(const Global_orig& rhs); 
    Global_orig& operator=(const Global_orig& rhs); 
}; 

template<typename T>T* const Global_orig<T>::pVar(new T); // << oh no! global construction 

int main(int argc, char* const argv[]) { 

    std::cout << ">> main: " << __PRETTY_FUNCTION__ << "\n\n"; 

    std::cout << Global<float>::Shared() << "\n"; 
    std::cout << Global<int>::Shared() << "\n"; 
    std::cout << Global<t_custom>::Shared() << "\n"; 

    std::cout << Global_orig<t_custom>::pVar << "\n"; 

    std::cout << "\n<< main: " << __PRETTY_FUNCTION__ << "\n\n"; 

    return 0; 
} 

它也可能是一個好主意,爲客戶提供了一個工廠函子你,而不是強迫他們使用T的默認初始值設定項。

0

下面是我用模仿這個問題的解決方案:

template <typename T> class Global { 
public:  
    static T *pVar; 

private:  
    Global() {} 
    Global(const Global& rhs) {} 
    void operator=(const Global& rhs) {} 
}; 

template <typename T> T* Global<T>::pVar = new T; 

這似乎做什麼,我想爲我的具體應用。是否有任何限制其適用性的問題?