把Singleton作为类的成员变量

#include <iostream>

template<typename T>
class SingletonTemplate {
public:
    SingletonTemplate() {
        std::cout << "In SingletonTemplate Construct" << std::endl ;
    }

public:
    static T& Instance() {
        if(m_pInstance == NULL) {
            m_pInstance = new T ;
        }
        return *m_pInstance ;
    }

private:
    SingletonTemplate<T>* operator = (const SingletonTemplate<T>*) {}

private:
    static T* m_pInstance ;
} ;

template<typename T>
T* SingletonTemplate<T>::m_pInstance = NULL ;

class CB {
public:
    CB() {
        std::cout << "In CB Construct" << std::endl ;
    }

    ~CB() {
        std::cout << "In CB DeConstruct" << std::endl ;
    }

    void PrintFun() {
        std::cout << "value of m_i:" << m_i << std::endl ;
    }

    void SetI(int value) {
        m_i = value ;
    }

    int GetI() {
        return m_i ;
    }

private:
    int m_i ;
} ;

class CA {
public:
    SingletonTemplate<CB> m_CBInstance ;
} ;

class CC {
public:
    SingletonTemplate<CB> m_CBInstance ;
} ;

template<typename T, size_t size>
class TT {
public:
    TT() {
        std::cout << "In TT Construct, size:" << size << std::endl ;
    }
} ;

class CTestCC {
public:
    SingletonTemplate<TT<char, 1024> > m_ccInst ;
} ;

class CTestCC2 {
public:
    SingletonTemplate<TT<char, 1024> > m_ccInst_char_1024 ;
    SingletonTemplate<TT<char, 128> > m_ccInst_char_128 ;
    SingletonTemplate<TT<int, 128> > m_ccInst_int_128 ;
} ;

int main(int argc, char** argv) {
    CA* p_ca = new CA() ;
    CB* ptr = &p_ca->m_CBInstance.Instance() ;
    ptr->SetI(10) ;
    CC* p_cc = new CC() ;
    p_cc->m_CBInstance.Instance() ;
    std::cout << "Print By p_ca, i:" << p_ca->m_CBInstance.Instance().GetI() << std::endl ;
    std::cout << "Print By p_cc, i:" << p_cc->m_CBInstance.Instance().GetI() << std::endl ;

    delete p_ca ;
    p_ca = NULL ;
    delete p_cc ;
    p_cc = NULL ;

    
    std::cout << "Print By ptr, i:" << ptr->GetI() << std::endl ;
    

    CTestCC* p_testcc = new CTestCC() ;
    TT<char, 1024>* p_tt = &p_testcc->m_ccInst.Instance() ;
 
    CTestCC2* p_testcc2 = new CTestCC2() ;
    TT<char, 1024>* p_char_1024 = &p_testcc2->m_ccInst_char_1024.Instance() ;
    TT<char, 128>* p_char_128 = &p_testcc2->m_ccInst_char_128.Instance() ;
    TT<int, 128>* p_int_128 = &p_testcc2->m_ccInst_int_128.Instance() ;

    return 0 ;
}
/*
In SingletonTemplate Construct
In CB Construct
In SingletonTemplate Construct
Print By p_ca, i:10
Print By p_cc, i:10
Print By ptr, i:10

In SingletonTemplate Construct
In TT Construct, size:1024
In SingletonTemplate Construct
In SingletonTemplate Construct
In SingletonTemplate Construct
In TT Construct, size:128
In TT Construct, size:128
*/






### C++ 对象作为成员的直接初始化 在C++中,当一个的对象被用作另一个的成员时,可以直接对其进行初始化。这种情况下,可以在构造函数的初始化列表中完成这一操作。 #### 使用初始化列表进行成员对象初始化 对于`MyClass`拥有其他的对象作为其成员的情况,推荐的做法是在构造函数的初始化列表中对该成员对象进行显式的初始化: ```cpp class A { public: A(int val) : value(val) {} private: int value; }; class B { public: B() : a_object(42), b_value(99) {} // 初始化列表用于初始化a_object和b_value private: A a_object; // 对象A作为成员变量 int b_value; // 普通整型成员变量 }; ``` 上述代码展示了如何通过构造函数的初始化列表来设置成员对象`a_object`的初始状态[^1]。 #### 成员对象默认构造方式 如果希望依赖于成员对象自身的默认构造函数,则无需特别指定,在定义成员位置处即可采用花括号语法来进行简的值初始化或聚合初始化(适用于支持此特性的型),如下所示: ```cpp class Container { public: Container(); // 默认构造函数可能不需要参数 private: std::vector<int> elements{1, 2, 3}; // 聚合初始化向量 std::map<int, std::string> mappings{{1,"one"}, {2,"two"}}; // 复杂型的嵌套初始化 }; ``` 这里展示的是利用现代C++特性简化了某些场景下的初始化过程。 #### 静态成员对象处理 需要注意的是,静态数据成员不属于任何一个具体的实而是整个所共有;因此它们应当独在外部分配空间并初始化。这同样适用于静态成员对象的情形: ```cpp class Singleton { public: static const Singleton& instance(); private: static Singleton* s_instance; Singleton(); }; // 文件作用域外部链接声明 Singleton* Singleton::s_instance = nullptr; ``` 此处说明了静态成员对象应遵循特定规则以确保程序逻辑正确性[^3]。 #### 关联问题考虑 考虑到拷贝语义的影响,当涉及到含有复杂资源管理功能的成员对象时,应该仔细设计拷贝构造函数的行为,防止潜在的风险如浅复制带来的双释放错误等问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值