第六章 單件模式

2021-07-03 13:28:47 字數 2383 閱讀 2858

單件模式比較簡單

最常用的寫法,子類繼承它既可。

template

class csingleton

return *pinstance_;

}private:

static t* pinstance_;

protected:

csingleton(void)

;template

t* csingleton::pinstance_ = null;

該寫法有個問題,instance_是沒有析構了,只有退出應用程式,靠作業系統去**

改進方案:

將instance申明為static,依賴於c++的語言機制去**

該方案比較簡單,但是也有個小問題,如果單件**有順序要求,那就不可控了,static對於c++語言要求的析構順序是:先申明的後析構。

可以使用一種其它方案:在程式退出main中,可以增加乙個函式指標,這個函式指標會在exit中進行呼叫。我們對每個單件申明乙個壽命期的變數,壽命期越長的,越晚析構。

其實就是將它儲存到vector中,然後依次從vector中取單件物件進行析構,壽命期越晚的,放到越後面

lifetimertracker.h的實現

#pragma once

#include

#include

#include

#include

//using namespace std;

// 帶壽命的singletons

class lifetimetracker

;inline lifetimetracker::~lifetimetracker(){}

bool mycompare(const lifetimetracker* pleft, const lifetimetracker* pright);

typedef lifetimetracker** trackerarray;

extern trackerarray ptrackerarray;

extern unsigned int elements;

//template

void delete(t* pobj)

//template

class concretelifetimetracker: public lifetimetracker

~concretelifetimetracker()

private:

t* ptracked_;

destroyer destroyer_;

};void atexitfn();

template

void setlongevity(t* pdynobject, unsigned int longevity, destroyer d = delete)

ptrackerarray = pnewarray;

lifetimetracker* p = new concretelifetimetracker(pdynobject, longevity, d);

// 用到了乙個排序

trackerarray pos = std::upper_bound(ptrackerarray, ptrackerarray + elements, p, mycompare);

std::copy_backward(pos, ptrackerarray + elements, ptrackerarray + elements + 1);

*pos = p;

++elements;

_atexit(atexitfn);

}lifetimertracker.cpp的實現

#include "stdafx.h"

#include "lifetimertracker.h"

trackerarray ptrackerarray;

unsigned int elements;

void atexitfn()

bool mycompare(const lifetimetracker* pleft, const lifetimetracker* pright)

簡單的測試**

class ctestsingle

ctestsingle* pinstance2 = new ctestsingle;

setlongevity(pinstance2, 2, delete);

}private:

static ctestsingle* pinstance_;

int i;

};ctestsingle* ctestsingle::pinstance_ = null;

void bar()

void fun()

void ctestsingleton::test()



mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...

第六章總結

6.1 使用滑鼠 6.1.1 滑鼠時間和滑鼠訊息 根據使用者操作滑鼠時滑鼠的位置,滑鼠訊息分為兩類 客戶區滑鼠訊息和非客戶區滑鼠訊息。1.客戶去滑鼠訊息 2.當滑鼠游標位於視窗的使用者區時,將生成客戶滑鼠訊息。滑鼠訊息和鍵盤訊息有所不同,windows 只將鍵盤有訊息傳送給具有輸入極點的視窗,但滑鼠...