/* 有时候可能会用到static变量,如果将static变量定义成non-local的,
那么我们无法保障在需要使用该变量的时候该变量已经进行被初始化了;
解决该问题的方式是将non-local的静态变量定义到函数内,
然后通过返回该静态变量的引用的形式使调用者获取到静态变量;
该静态变量在函数被第一次调用的时候被初始化 */
#include <iostream>
class Supplier;
class Printer;
Supplier &getSupplier();
Printer &getPrinter();
class Supplier
{
public:
Supplier(int id = 0) : m_id(id) {
std::cout << "Book ctor called." << std::endl;
}
~Supplier() {}
int getId() {
return m_id;
}
private:
int m_id;
};
class Printer
{
public:
Printer(int id = 0)/* : m_supplier_id(getSupplier().getId())*/ {
m_supplier_id = getSupplier().getId();
std::cout << "Printer ctor called." << std::endl;
}
~Printer() {}
private:
int m_supplier_id;
};
/* 以函数调用返回一个reference指向local static对象,替换直接访问non-local static对象 */
Supplier &getSupplier()
{
static Supplier stabook; /* 第一次调用该函数时stabook被初始化,会去执行Supplier的构造函数,
再次调用时这句不会再去执行Supplier的构造函数 */
return stabook;
}
/* 以函数调用返回一个reference指向local static对象,替换直接访问non-local static对象 */
Printer &getPrinter()
{
static Printer staprinter;
return staprinter;
}
int main() {
Supplier aSupplier;
Printer aPrinter;
Printer bPrinter;
return 0;
}
Reference
Scott Meyers. Effective C++ , 55 Specific Ways to Improve Your Programs and Designs, Third Edition