際際滷

際際滷Share a Scribd company logo
覦讌乏
 Pimpl 企
 炎り骸 襴 覃
 襦, 企一 殊
 旧覯
 企 蟲豌伎 貊襯 public る 朱
覿  蟾
 蠍磯蓋朱 private 覃る 覲 襯 .cpp
殊 豺
螻糾 誤壱伎
Public:
Function1()
Function2()
Protected:
Function3()
Private:
Impl* pImpl 企 蟲
Public:
PrivateFuntion1()
PrivateFunction2()
PrivateData1
privateData2
pImpl 企 蟆讌 蟲 企るゼ 企 誤磯 螳襴る 螻糾
企るゼ 襷
// autotimer.h
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
#include <string>
class AutoTimer
{
public:
/// Create a new timer object with a human readable name
explicit AutoTimer(const std::string &name);
/// On destruction, the timer reports how long it was alive
AutoTimer();
private:
// Return how long the object has been alive
double GetElapsed() const;
std::string mName;
#ifdef WIN32
DWORD mStartTime;
#else
struct timeval mStartTime;
#endif
// autotimer.h
#include <string>
class AutoTimer
{
public:
explicit AutoTimer(const std::string &name);
AutoTimer();
private:
class Impl;
Impl *mImpl;
};
#include "autotimer.h"
#include <iostream>
#if_WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
class AutoTimer::Impl
{
public:
double GetElapsed() const
{
#ifdef _WIN32
return (GetTickCount() - mStartTime) / 1e3;
#else
struct timeval end_time;
gettimeofday(&end_time, NULL);
double t1 = mStartTime.tv_usec / 1e6 + mStartTime.tv_sec;
double t2 = end_time.tv_usec / 1e6 + end_time.tv_sec;
return t2-t1;
#endif
}
std::string mName;
#ifdef _WIN32
DWORD mStartTime;
#else
struct timeval mStartTime;
#endif
AutoTimer::AutoTimer(const std::string &name) : mImpl(new AutoTimer::Impl())
{
mImpl->mName name;
#ifdef _WIN32
mImpl->mStartTime = GetTickCount();
#else
gettimeofday(&mImpl->mStartTime, NULL);
#endif
}
AutoTimer::AutoTimer()
{
std::cout << mImpl >mName << ": took " << mImpl >GetElapsed() << " secs" << std::endl;
delete mImpl;
mImpl = NULL;
}
AutoTimer::AutoTimer(const std::string &name) : mImpl(new AutoTimer::Impl())
{
mImpl->mName name;
#ifdef _WIN32
mImpl->mStartTime = GetTickCount();
#else
gettimeofday(&mImpl->mStartTime, NULL);
#endif
}
AutoTimer::AutoTimer()
{
std::cout << mImpl >mName << ": took " << mImpl >GetElapsed() << " secs" << std::endl;
delete mImpl;
mImpl = NULL;
}
1. Private 覃る 覲襷 .
2. Private 覃る 覲 襯 .
3. Public 企れ 覈   
襯 Impl 企れ 蟲.
 蠍磯蓋朱  覲旧螳 .
 れ 2螳讌  豬  覲旧 
豺 覈詩 る 覦 覦
 企るゼ 覲旧  蟆 襷
 Private朱 覲旧 煙  覦  一一 
 蟾 覲旧 蠍磯レ 覈朱
 覲 
 #define prive public
 #include yourapi.h
 #undef private
 譟伎 蟇
 Windows.h 覦 sys/time.h  譟伎 
 觜襯 貉危
 Api 螻豸 蟲譟郁 譴企
 一企 伎 誤
 Pimpl 企  螳豌伎 蠍磯  覦讌 
 讌 
 Pimpl 企る   焔蠍 覓語 ろ語 郁屋螻
螳   襷 觜  襴るゼ
 Pimpl 蟲 螳豌企ゼ 覃覈襴 麹螻 伎伎狩 覓語.
 誤一 蠍 覓語 螳豌 蠍  企 覈 覲 蠏殊
 螳 谿語^ 焔 覓語 覦
 New delete 語 磯ジ 豢螳 觜
 觜襯 Pimpl 企(new delete 一一襯 る襦 伎  覃覈襴襯 
襦 螻 蠍一 覃覈襴 轟襯   覃覈襴  覦
覯)
 貊襯 暑 蟆, 覯蟾 蟆 企れ 讌.
     覲れ 覿襴 螳豌  譟伎蠍 覓語
貉危朱  覲れ 螳 覲襯  伎 螳讌 .
void PimpledObject::ConstMethod() const
{
mImpl->mName = "string changed by a const method";
}
 伎 112 ~ 114 谿瑚
 企至 炎 螳豌企ゼ 麹 蟆瑚?
 語 炎 螳豌企ゼ 蟯  蟆瑚?
 磯 煙 讌 螳?
 讚(襷轟願 ) 炎伎 覃
企至 螳?
 覦   覲
 襦蠏碁   語ろ伎る 螻
覯讌 語ろ伎るゼ 襷   蠍磯
 一 磯 豕 覦覯れ 殊
 蠍磯蓋 煙襯 private 
 碁 new襦 螳豌  覿螳
 Singleton* pObject = new Singleton();  貉危 
 覲旧 煙, 覲旧 一一  private 
 覲旧襦 誤  覿螳
 襯 讌 螻 碁 
(螳 朱 覃る 轟  螳 語   蠍 覓語 
讌 )
 覲旧 煙
 Singleton object1( Singleton::GetInstance() );  貉危 
 覲旧  一一
 Singleton& object1 = Singleton::GetInstance();
 Singleton& object2 = Singleton::GetInstance();
 object1 = object2;  貉危
 .h
 .cpp
 Static 企 覃る 覲 static  覲豌 襦蠏碁
  main()  語 伎 豐蠍壱
 炎 螳豌 讌 朱 覓伎^蟇 焔蠍 覓
 觜
  螳豌企 るジ 螳豌伎 煙 谿瑚螻 
 蟆曙 覓語 覦   
 C++ 譴  螳豌企れ    覈蟆 
螻 讌 蠍 覓
 Main() 螳 ろ 蠍 襷 焔覃 
 企  螳豌伎 煙  炎 螳豌企ゼ 谿語^り
 蟆曙 炎 螳豌願 焔蠍  蟆曙 覓語 覦
 .h
 .cpp
 豕豐 GetInstace() 襯 語  螳豌願

 覯 企 螳豌企ゼ 燕讌 朱 螳豌 
 讌 朱襦  朱 
 るジ  螳豌伎 煙 谿語^ 蟆
螳
 襦蠏碁 譬襭 螳  螳豌企 
襦 伎蠍 覓語 蟲褐 覈朱 伎
 襦蠏碁 譬襭蠍  exit() 螳  cleanup 螻殊 (C++ 蠍一)
1.  thread thread storage duration 伎  object れ 覈
覃 ( C++11 only)
2. static storage duration objectれ 覃
1. Static storage duration
2. Thread storage duration
3. Automatic storage duration
4. Dynamic storage duration
3. atexit  焔  れ 語
4. 覈C stream(stdin, stdout, stderr 焔) 螻 tmpfile   焔
朱れ 觜郁 
5. 願 host environment 襦 願
 覯讌 炎 螳豌願 覦 襦蠏碁 譬襭
 覦伎  碁 ろ  
 蟆曙 
 炎 螳豌企ゼ 伎, OS 襴 襯 襷り 伎
讌 る "襴 襴:Resource Leak"  覦
 炎 螳豌伎 覃語 襴 伎 蠍磯レ 螻,
炎 螳豌企ゼ 蟯  朱 企 覓語 願屋
 Ateexit() 襯 
 るジ  螳豌伎 覃語襯 伎
 #include <stdlib.h>
 int atexit(void (*func)(void));
  語 炎概  0, ろ  0  螳 覦.
 覦螻 襷り覲  void襦 碁  企(譯殊 螳)
atexit 語襦 
 語襦  螳 襦蠏碁 譬襭  朱 語覃, 企蟆 
朱 語伎   32螳 伎 焔  .
 atexit  轟
 焔  朱 語
 atexit 襯 牛伎 焔  襦蠏碁 朱 譬襭 襷
語
 .h
.cpp
 .h
.cpp
 覈 伎  狩蠍  static 讌 螳
豌 
1. 讌 static 螳豌企  static 螳豌伎 襴 企 襯
豌 語   豐蠍壱
2.  螳豌企ゼ 覯 讌 朱 焔讌 
3. Static 企襦 襦蠏碁 譬襭  蟾讌 螳豌願 讌
4. 譬襭 朱 覃語 語
 襦蠏 螳豌, る慨 螳豌, 覈 螳豌願 譟伎覃, る讌 炎れ朱 蟲
(1)る慨 螳豌企ゼ 燕螻, 覈 螳豌企ゼ   譴 ろ,
(2)襦蠏 螳豌企ゼ 燕 襦蠏碁ゼ 谿
(3)蠏碁Μ螻 襦蠏碁 譬襭  れ 螳蟆 .
  
(4) 襦蠏 螳豌企 襾殊 .
(5)る慨 螳豌企ゼ 蟯危 , ろ,
(6)襦蠏 螳豌企ゼ 伎 襦蠏碁ゼ 谿朱 
讌襷, 襦蠏 螳豌企 企 蟯企 企襦, 讚 炎れ 蠏狩蟆 , 
螳 覦
  覿
 static  伎蠍 覓語, ろ 襦 覃覈襴 殊 , る慨 螳豌願 蟯企蠍  襦
蠏 螳豌 覿 蟯.
 覃 襦蠏 螳豌願 る慨 螳豌  襷れ伎蠍 覓
 る讌 炎 螳豌企ゼ るジ  螳豌伎 覃
 り 覃 覓語 覦
 C++ 譴  螳豌企れ  襷 覈
讌  蟆  覃  伎 覈
讌 
 企  螳豌願 覃語  炎 螳豌企ゼ 
り   炎 螳豌願 襾殊 覃誤る 覓
螳 覦 (谿語^ 覓危)
 炎 谿語^  企 螳豌伎 覃 覿襯 
螻 襷 覃誤る 企
 炎伎 蟯  譟一
 Static 讌 覲 轟
 覃覈襴 煙 襦蠏碁 static 讌覲 螳 
襯 語伎 
 襦蠏碁 譬襭  覃覈襴 蟯願 殊企 企 蠏
螻糾 觜 螻糾朱  ( るジ蟆朱 豈讌讌
)
  轟 .
 襦蠏碁 譬襭  蠏 覃覈襴 螻糾 れ 郁鍵 
 replacement new襯 
 蟯  危蠍  std::atexit
 Replacement new
 企 豪 覃覈襴 螻糾 煙襷 語
 朱 new豌  語襦 覃覈襴螳 豪伎 誤磯ゼ
蟆譴
 企朱 void* operator new(size_t, void*)  new襯 語
 Ex)
 void* pBase = malloc(sizeof(CBase));
 new(pBase) CBase;
 覃覈襴襯  讌 
 蠍一ヾ 一危郁 蠏碁襦 螻, 煙 豐蠍壱 一危
襷 豐蠍壱
 螳 企 豐蠍壱
 覃覈襴襷 煙 蟆
 .h
 .cpp
Static 螳豌伎 /覃    伎 炎 螳豌企ゼ 
 螳豌伎 / 覃語 襷蟲′企 谿語^ 殊 襦 譯殊伎
襦蠏碁覦 伎狩
 螻ろ伎  
 炎 螳豌伎  蠍壱
 螻ろ伎  
 炎 螳豌伎  蠍壱
 覃 る 蟆 讌
 磯A螳 GetInstance()  讌
 1覯 譟郁唄 豌危 螻 れ 譴 ろ  譴讌
 磯 B螳 GetInstance()  讌
 磯 B s_pInstance螳 NULL 企襦 1覯 螻 讌.

 磯 B 2覯 ろ 螳豌   語蟆 instance 襴
 磯A れ 讌 . 2覯 れ 語 るジ 語ろ伎 
A磯 京磯
2覯
1覯
2覯
1覯
京磯
 蟆曙一襷 曙  蠍 
 譟郁唄 豌危 曙 詞  伎 るジ 
螳 襾殊 れ伎 pInstance襯 豐蠍壱 
 蠍 覓語 覯 null 語 豌危
 s_pInstance = new LazySingleton(); 覩
 1. Singleton 螳豌企ゼ 願鍵  覃覈襴襯 
 2. 豪 覃覈襴 Singleton 螳豌企ゼ 
 3. s_pInstance螳 豪 覃覈襴襯 螳襴る襦 
 貉危朱螳  襦 襦 讌
. 貉危朱 襦 ろ 2 ろ 3伎
襯 覦蠑瑚鍵
 A磯 s_pInstance螳 豪 覃覈襴
襯 螳襴る襦 螻 蠏  豪 覃覈襴
 螳豌企ゼ  伎   
 B 磯 炎 螳豌企ゼ 覦襦  蟆
 蟷郁鍵襯 蠏狩 覓語 覦
 (炎 螳豌企 覃覈襴襯 螳襴り鍵襷 螻
れ 螳豌願豌 煙  )
 Volatile  讌
 volatile襦 碁 螳豌(覲, 覃覈襴 豺, 貊)
optimize 襭一 讌 襷.
 ( Objects declared as volatile are not used in certain
optimizations ( 豢豌 - MSDN ))
 貉危朱螳  煙 螻ろ optimize 蟯 貊
襯 襦 覲蟆(覩  貊  ろ 
覲蟆) れ 
 volatile襦 碁 螳豌企 覃覈襴 豪螻  
豌 讌(企 譯殊), 覦襦(  讌 
) 豌襴.
 volatile れ襯 伎  螻褐 る C++11
 atomic 覲襯 
 C++11 '襦 るジ る 螳  蟯螻螳 
 讌  覃覈襴 所鍵 郁鍵 譟一 data race
     ' 手  .
 讀 C++11 volatile 覲 Memory Barrier 
り 覈讌 
 覃覈襴 覦襴企 覿覿  譴 蠍郁伎 
覃  レ螳 螻旧 覃覈襴襯  
一
Api design for c++ pattern
 Lazy Instance 覈  貊螳 ろ ,
main()  語蠍 企 覡ろ 蠍朱
API螳 豐蠍壱  豐蠍壱
  豐蠍壱
static Singleton& foo = Singleton::GetInstance();
 覈 API 豐蠍壱
VoidAPIInitialize()
{
Mutex mutex;
ScopredLock(&mutex);
Singleton::GetInstance();
}
 譟伎 曙
class MyClass
{
public:
MyClass() : mDatabase( new Database ("mydb, "localhost", "user", "pass"))
{}
private:
Database* mDatabase;
}
class MyClass
{
public:
MyClass(Database* db) : mDatabase(db)
{}
private:
Database* mDatabase;
}
 覈語ろ危 
 炎れ 覓語  襯 讌螻 蠏狩一 覦
// monostate.h
class MonoState
{
public:
int GetTheAnswer() const { return sAnswer; }
private:
static int sAnswer;
};
// monostate.cpp
int MonoState::sAnswer = 42;
 語 覓碁Д
 C++ 煙  
 蟆郁骸 螳 襴 覿螳
 覈覈 蠏豺 
   螳豌 
 螳 煙 覿
 襴 覃  曙 蟲覦讌
// renderer.h
#include <string>
class IRenderer
{
public:
virtual IRenderer() {}
virtual bool LoadScene(const std::string &filename) 0;
virtual void SetViewportSize(int w, int h) 0;
virtual void SetCameraPosition(double x, double y, double z) 0;
virtual void SetLookAt(double x, double y, double z) 0;
virtual void Render() 0;
};
// rendererfactory.h
#include "renderer.h"
#include <string>
class RendererFactory
{
public:
IRenderer *CreateRenderer(const std::string &type);
};
// rendererfactory.cpp
#include "rendererfactory.h"
#include "openglrenderer.h"
#include "directxrenderer.h"
#include "mesarenderer.h
IRenderer *RendererFactory::CreateRenderer(const std::string &type)
{
if (type "opengl")
return new OpenGLRenderer();
if (type "directx")
return new DirectXRenderer();
if (type "mesa")
return new MesaRenderer();
return NULL;
 螳   語ろ伎るゼ 壱
 燕蠍 覓語 一 螻
  企れ る 殊 襴襯 蟲
 .cpp 殊襷 譟伎覃 public朱 
碁 RenererFacory.h 殊 讌 

 蠏碁 願 蟆 襦 蠏碁
豌襴蠍磯ゼ 螻牛讌 覈詩.
 襴 覃  企り 郁屋 蟯
螻襯 蟆 襷
 壱 襦  企るゼ 豢螳
 襦  企 螳豌  貊覦 
 郁屋る 襷旧 襴 企れ
// rendererfactory.h
#include "renderer.h"
#include <string>
#include <map>
class RendererFactory
{
public:
typedef IRenderer *(*CreateCallback)();
static void RegisterRenderer(const std::string &type, CreateCallback cb);
static void UnregisterRenderer(const std::string &type);
static IRenderer *CreateRenderer(const std::string &type);
private:
typedef std::map<std::string, CreateCallback> CallbackMap;
static CallbackMap mRenderers;
};
#include "rendererfactory.h"
// instantiate the static variable in RendererFactory
RendererFactory::CallbackMap RendererFactory::mRenderers;
void RendererFactory::RegisterRenderer(const std::string &type, CreateCallback cb)
{
mRenderers[type] cb;
}
void RendererFactory::UnregisterRenderer(const std::string &type)
{
mRenderers.erase(type);
}
IRenderer *RendererFactory::CreateRenderer(const std::string &type)
{
CallbackMap::iterator it mRenderers.find(type);
if (it ! mRenderers.end())
{
// call the creation callback to construct this derived type
return (it >second)();
}
return NULL;
}
class UserRenderer : public IRenderer
{
public:
UserRenderer() {}
bool LoadScene(const std::string &filename) { return true; }
void SetViewportSize(int w, int h) {}
void SetCameraPosition(double x, double y, double z) {}
void SetLookAt(double x, double y, double z) {}
void Render() { std::cout << "User Render" << std::endl; }
static IRenderer *Create() { return new UserRenderer(); }
};
int main(int, char **)
{
// register a new renderer
RendererFactory::RegisterRenderer("user", UserRenderer::Create);
// create an instance of our new renderer
IRenderer *r RendererFactory::CreateRenderer("user");
r->Render();
delete r;
return 0;
}
  企れ 誤壱伎るゼ 企殊伎誤語
螻  るジ 誤壱伎る 覲
企磯ゼ 伎覃 誤壱伎 誤 覓語
覓語 螳    企るれ 郁屋
   .
public class Adapter implements target{
request(){
translatedRequest();
}
}
企殊伎誤語 企磯 襦 覿襴
襦 覦 伎  覈襴.
企一 蟆 誤壱伎るゼ蟲
企磯 企磯 蟲
覈 豌 企一蟆 
public class Adapter implements target{
request(){
specificRequest();
}
}
螳豌 蟲(Composition) 
企一 企 觚企れ 伎 企
襯   る レ
企殊伎誤碁ゼ 轟 蟲  誤壱伎れ 郁屋
-  企  螳
- 蟆 誤壱伎る 襦 讌るる るジ 蟲
豢螳 螳
れ 伎 企
磯ゼ 企一 貅 企
覈 觚企る 襷.
 覦 れ襦 讌  貊
public class Adapter extends Target, Adaptee{
public void request(){
specificRequest();
}
}
- 企 豌企 れ 蟲讌  
- 企一  る殊企 螳
- 蟲煙 蠍 覓語 蠏 
觚企れ 伎 企
 企 觚ろ 朱 誤壱伎れ  牛 誤壱伎るゼ 螻
殊 螻譴 誤壱伎るゼ 蠍 覓語 觚ろ  所
企 れ伎願係
1. 朱 蟯螻 (one-to-many)
 襯 ロ螻 讌覦壱 蟆 譯殊 螳豌.
 旧覯  螳螳   讌襷,
譯殊 螳豌伎 螳 覦る 蟆 れ手鍵襯
蠍磯るΜ 譯殊 譟  煙 螳讌.
2. 譟伎
1. 旧覯 譯殊 螳豌願 一危磯ゼ 螳煙 譯手鍵襯
蠍磯るΜ  願鍵 覓語 譟伎煙 螳讌.
2. 企 覦朱 誤
蟾 螳豌伎 語 襷  .
update()
<interface>
Observer
regosterObserver() {  }
removeObserver() {  }
notifyObservers() {  }
getState( )
setState( )
ConcreateSubject
regosterObserver()
removeObserver()
notifyObservers()
<interface>
Subject
update()
//蠍壱 企 旧覯 覃

ConcreateObserver
旧覯
譯殊
旧覯螳  螳レ
  螳豌企 企
誤壱伎 .
旧覯襯
焔//螻旧 
蠍磯
襯 れ
覃螳 
 旧覯 
 螳豌伎 螳 覦覃 蠏 螳豌
 譟危 るジ 螳豌企ろ 磯
 螳螻 朱 伎 螳煙
覦朱 朱(one-to-many) 
譟伎煙
 旧覯 伎 譯殊 旧覯螳 蟆 蟆壱 
螳豌 語 螻.
 譯殊螳 旧覯   蟆 旧覯螳 轟 誤壱伎るゼ
蟲(implements) る 蟆 訖.
 旧覯 語讌 襦 豢螳  
 襦  旧覯襯 豢螳り   譯殊襯  覲蟆
 螳 .
 譯殊 旧覯 襦 襴曙朱   .
 譯殊 旧覯螳 覦朱 襦 レ 覩語讌 .
螳矧

More Related Content

Api design for c++ pattern

  • 2. Pimpl 企 炎り骸 襴 覃 襦, 企一 殊 旧覯
  • 3. 企 蟲豌伎 貊襯 public る 朱 覿 蟾 蠍磯蓋朱 private 覃る 覲 襯 .cpp 殊 豺
  • 4. 螻糾 誤壱伎 Public: Function1() Function2() Protected: Function3() Private: Impl* pImpl 企 蟲 Public: PrivateFuntion1() PrivateFunction2() PrivateData1 privateData2 pImpl 企 蟆讌 蟲 企るゼ 企 誤磯 螳襴る 螻糾 企るゼ 襷
  • 5. // autotimer.h #ifdef WIN32 #include <windows.h> #else #include <sys/time.h> #endif #include <string> class AutoTimer { public: /// Create a new timer object with a human readable name explicit AutoTimer(const std::string &name); /// On destruction, the timer reports how long it was alive AutoTimer(); private: // Return how long the object has been alive double GetElapsed() const; std::string mName; #ifdef WIN32 DWORD mStartTime; #else struct timeval mStartTime; #endif
  • 6. // autotimer.h #include <string> class AutoTimer { public: explicit AutoTimer(const std::string &name); AutoTimer(); private: class Impl; Impl *mImpl; };
  • 7. #include "autotimer.h" #include <iostream> #if_WIN32 #include <windows.h> #else #include <sys/time.h> #endif class AutoTimer::Impl { public: double GetElapsed() const { #ifdef _WIN32 return (GetTickCount() - mStartTime) / 1e3; #else struct timeval end_time; gettimeofday(&end_time, NULL); double t1 = mStartTime.tv_usec / 1e6 + mStartTime.tv_sec; double t2 = end_time.tv_usec / 1e6 + end_time.tv_sec; return t2-t1; #endif } std::string mName; #ifdef _WIN32 DWORD mStartTime; #else struct timeval mStartTime; #endif
  • 8. AutoTimer::AutoTimer(const std::string &name) : mImpl(new AutoTimer::Impl()) { mImpl->mName name; #ifdef _WIN32 mImpl->mStartTime = GetTickCount(); #else gettimeofday(&mImpl->mStartTime, NULL); #endif } AutoTimer::AutoTimer() { std::cout << mImpl >mName << ": took " << mImpl >GetElapsed() << " secs" << std::endl; delete mImpl; mImpl = NULL; }
  • 9. AutoTimer::AutoTimer(const std::string &name) : mImpl(new AutoTimer::Impl()) { mImpl->mName name; #ifdef _WIN32 mImpl->mStartTime = GetTickCount(); #else gettimeofday(&mImpl->mStartTime, NULL); #endif } AutoTimer::AutoTimer() { std::cout << mImpl >mName << ": took " << mImpl >GetElapsed() << " secs" << std::endl; delete mImpl; mImpl = NULL; }
  • 10. 1. Private 覃る 覲襷 . 2. Private 覃る 覲 襯 . 3. Public 企れ 覈 襯 Impl 企れ 蟲.
  • 11. 蠍磯蓋朱 覲旧螳 . れ 2螳讌 豬 覲旧 豺 覈詩 る 覦 覦 企るゼ 覲旧 蟆 襷 Private朱 覲旧 煙 覦 一一 蟾 覲旧 蠍磯レ 覈朱
  • 12. #define prive public #include yourapi.h #undef private 譟伎 蟇 Windows.h 覦 sys/time.h 譟伎 觜襯 貉危 Api 螻豸 蟲譟郁 譴企 一企 伎 誤 Pimpl 企 螳豌伎 蠍磯 覦讌 讌 Pimpl 企る 焔蠍 覓語 ろ語 郁屋螻 螳 襷 觜 襴るゼ
  • 13. Pimpl 蟲 螳豌企ゼ 覃覈襴 麹螻 伎伎狩 覓語. 誤一 蠍 覓語 螳豌 蠍 企 覈 覲 蠏殊 螳 谿語^ 焔 覓語 覦 New delete 語 磯ジ 豢螳 觜 觜襯 Pimpl 企(new delete 一一襯 る襦 伎 覃覈襴襯 襦 螻 蠍一 覃覈襴 轟襯 覃覈襴 覦 覯) 貊襯 暑 蟆, 覯蟾 蟆 企れ 讌. 覲れ 覿襴 螳豌 譟伎蠍 覓語 貉危朱 覲れ 螳 覲襯 伎 螳讌 . void PimpledObject::ConstMethod() const { mImpl->mName = "string changed by a const method"; }
  • 14. 伎 112 ~ 114 谿瑚
  • 15. 企至 炎 螳豌企ゼ 麹 蟆瑚? 語 炎 螳豌企ゼ 蟯 蟆瑚? 磯 煙 讌 螳? 讚(襷轟願 ) 炎伎 覃 企至 螳?
  • 16. 覲 襦蠏碁 語ろ伎る 螻 覯讌 語ろ伎るゼ 襷 蠍磯 一 磯 豕 覦覯れ 殊
  • 17. 蠍磯蓋 煙襯 private 碁 new襦 螳豌 覿螳 Singleton* pObject = new Singleton(); 貉危 覲旧 煙, 覲旧 一一 private 覲旧襦 誤 覿螳 襯 讌 螻 碁 (螳 朱 覃る 轟 螳 語 蠍 覓語 讌 ) 覲旧 煙 Singleton object1( Singleton::GetInstance() ); 貉危 覲旧 一一 Singleton& object1 = Singleton::GetInstance(); Singleton& object2 = Singleton::GetInstance(); object1 = object2; 貉危
  • 19. Static 企 覃る 覲 static 覲豌 襦蠏碁 main() 語 伎 豐蠍壱 炎 螳豌 讌 朱 覓伎^蟇 焔蠍 覓 觜 螳豌企 るジ 螳豌伎 煙 谿瑚螻 蟆曙 覓語 覦 C++ 譴 螳豌企れ 覈蟆 螻 讌 蠍 覓 Main() 螳 ろ 蠍 襷 焔覃 企 螳豌伎 煙 炎 螳豌企ゼ 谿語^り 蟆曙 炎 螳豌願 焔蠍 蟆曙 覓語 覦
  • 21. 豕豐 GetInstace() 襯 語 螳豌願 覯 企 螳豌企ゼ 燕讌 朱 螳豌 讌 朱襦 朱 るジ 螳豌伎 煙 谿語^ 蟆 螳 襦蠏碁 譬襭 螳 螳豌企 襦 伎蠍 覓語 蟲褐 覈朱 伎
  • 22. 襦蠏碁 譬襭蠍 exit() 螳 cleanup 螻殊 (C++ 蠍一) 1. thread thread storage duration 伎 object れ 覈 覃 ( C++11 only) 2. static storage duration objectれ 覃 1. Static storage duration 2. Thread storage duration 3. Automatic storage duration 4. Dynamic storage duration 3. atexit 焔 れ 語 4. 覈C stream(stdin, stdout, stderr 焔) 螻 tmpfile 焔 朱れ 觜郁 5. 願 host environment 襦 願
  • 23. 覯讌 炎 螳豌願 覦 襦蠏碁 譬襭 覦伎 碁 ろ 蟆曙 炎 螳豌企ゼ 伎, OS 襴 襯 襷り 伎 讌 る "襴 襴:Resource Leak" 覦 炎 螳豌伎 覃語 襴 伎 蠍磯レ 螻, 炎 螳豌企ゼ 蟯 朱 企 覓語 願屋 Ateexit() 襯 るジ 螳豌伎 覃語襯 伎
  • 24. #include <stdlib.h> int atexit(void (*func)(void)); 語 炎概 0, ろ 0 螳 覦. 覦螻 襷り覲 void襦 碁 企(譯殊 螳) atexit 語襦 語襦 螳 襦蠏碁 譬襭 朱 語覃, 企蟆 朱 語伎 32螳 伎 焔 . atexit 轟 焔 朱 語 atexit 襯 牛伎 焔 襦蠏碁 朱 譬襭 襷 語
  • 27. 覈 伎 狩蠍 static 讌 螳 豌 1. 讌 static 螳豌企 static 螳豌伎 襴 企 襯 豌 語 豐蠍壱 2. 螳豌企ゼ 覯 讌 朱 焔讌 3. Static 企襦 襦蠏碁 譬襭 蟾讌 螳豌願 讌 4. 譬襭 朱 覃語 語
  • 28. 襦蠏 螳豌, る慨 螳豌, 覈 螳豌願 譟伎覃, る讌 炎れ朱 蟲 (1)る慨 螳豌企ゼ 燕螻, 覈 螳豌企ゼ 譴 ろ, (2)襦蠏 螳豌企ゼ 燕 襦蠏碁ゼ 谿 (3)蠏碁Μ螻 襦蠏碁 譬襭 れ 螳蟆 . (4) 襦蠏 螳豌企 襾殊 . (5)る慨 螳豌企ゼ 蟯危 , ろ, (6)襦蠏 螳豌企ゼ 伎 襦蠏碁ゼ 谿朱 讌襷, 襦蠏 螳豌企 企 蟯企 企襦, 讚 炎れ 蠏狩蟆 , 螳 覦 覿 static 伎蠍 覓語, ろ 襦 覃覈襴 殊 , る慨 螳豌願 蟯企蠍 襦 蠏 螳豌 覿 蟯. 覃 襦蠏 螳豌願 る慨 螳豌 襷れ伎蠍 覓
  • 29. る讌 炎 螳豌企ゼ るジ 螳豌伎 覃 り 覃 覓語 覦 C++ 譴 螳豌企れ 襷 覈 讌 蟆 覃 伎 覈 讌 企 螳豌願 覃語 炎 螳豌企ゼ り 炎 螳豌願 襾殊 覃誤る 覓 螳 覦 (谿語^ 覓危)
  • 30. 炎 谿語^ 企 螳豌伎 覃 覿襯 螻 襷 覃誤る 企 炎伎 蟯 譟一
  • 31. Static 讌 覲 轟 覃覈襴 煙 襦蠏碁 static 讌覲 螳 襯 語伎 襦蠏碁 譬襭 覃覈襴 蟯願 殊企 企 蠏 螻糾 觜 螻糾朱 ( るジ蟆朱 豈讌讌 ) 轟 . 襦蠏碁 譬襭 蠏 覃覈襴 螻糾 れ 郁鍵 replacement new襯 蟯 危蠍 std::atexit
  • 32. Replacement new 企 豪 覃覈襴 螻糾 煙襷 語 朱 new豌 語襦 覃覈襴螳 豪伎 誤磯ゼ 蟆譴 企朱 void* operator new(size_t, void*) new襯 語 Ex) void* pBase = malloc(sizeof(CBase)); new(pBase) CBase; 覃覈襴襯 讌 蠍一ヾ 一危郁 蠏碁襦 螻, 煙 豐蠍壱 一危 襷 豐蠍壱 螳 企 豐蠍壱 覃覈襴襷 煙 蟆
  • 33. .h
  • 34. .cpp Static 螳豌伎 /覃 伎 炎 螳豌企ゼ 螳豌伎 / 覃語 襷蟲′企 谿語^ 殊 襦 譯殊伎 襦蠏碁覦 伎狩
  • 35. 螻ろ伎 炎 螳豌伎 蠍壱
  • 36. 螻ろ伎 炎 螳豌伎 蠍壱
  • 37. 覃 る 蟆 讌
  • 38. 磯A螳 GetInstance() 讌 1覯 譟郁唄 豌危 螻 れ 譴 ろ 譴讌 磯 B螳 GetInstance() 讌 磯 B s_pInstance螳 NULL 企襦 1覯 螻 讌. 磯 B 2覯 ろ 螳豌 語蟆 instance 襴 磯A れ 讌 . 2覯 れ 語 るジ 語ろ伎 A磯 京磯 2覯 1覯 2覯 1覯
  • 40. 蟆曙一襷 曙 蠍 譟郁唄 豌危 曙 詞 伎 るジ 螳 襾殊 れ伎 pInstance襯 豐蠍壱 蠍 覓語 覯 null 語 豌危
  • 41. s_pInstance = new LazySingleton(); 覩 1. Singleton 螳豌企ゼ 願鍵 覃覈襴襯 2. 豪 覃覈襴 Singleton 螳豌企ゼ 3. s_pInstance螳 豪 覃覈襴襯 螳襴る襦 貉危朱螳 襦 襦 讌 . 貉危朱 襦 ろ 2 ろ 3伎 襯 覦蠑瑚鍵
  • 42. A磯 s_pInstance螳 豪 覃覈襴 襯 螳襴る襦 螻 蠏 豪 覃覈襴 螳豌企ゼ 伎 B 磯 炎 螳豌企ゼ 覦襦 蟆 蟷郁鍵襯 蠏狩 覓語 覦 (炎 螳豌企 覃覈襴襯 螳襴り鍵襷 螻 れ 螳豌願豌 煙 )
  • 43. Volatile
  • 44. volatile襦 碁 螳豌(覲, 覃覈襴 豺, 貊) optimize 襭一 讌 襷. ( Objects declared as volatile are not used in certain optimizations ( 豢豌 - MSDN )) 貉危朱螳 煙 螻ろ optimize 蟯 貊 襯 襦 覲蟆(覩 貊 ろ 覲蟆) れ volatile襦 碁 螳豌企 覃覈襴 豪螻 豌 讌(企 譯殊), 覦襦( 讌 ) 豌襴.
  • 45. volatile れ襯 伎 螻褐 る C++11 atomic 覲襯 C++11 '襦 るジ る 螳 蟯螻螳 讌 覃覈襴 所鍵 郁鍵 譟一 data race ' 手 . 讀 C++11 volatile 覲 Memory Barrier り 覈讌 覃覈襴 覦襴企 覿覿 譴 蠍郁伎 覃 レ螳 螻旧 覃覈襴襯 一
  • 47. Lazy Instance 覈 貊螳 ろ , main() 語蠍 企 覡ろ 蠍朱 API螳 豐蠍壱 豐蠍壱 豐蠍壱 static Singleton& foo = Singleton::GetInstance(); 覈 API 豐蠍壱 VoidAPIInitialize() { Mutex mutex; ScopredLock(&mutex); Singleton::GetInstance(); }
  • 48. 譟伎 曙 class MyClass { public: MyClass() : mDatabase( new Database ("mydb, "localhost", "user", "pass")) {} private: Database* mDatabase; } class MyClass { public: MyClass(Database* db) : mDatabase(db) {} private: Database* mDatabase; }
  • 49. 覈語ろ危 炎れ 覓語 襯 讌螻 蠏狩一 覦 // monostate.h class MonoState { public: int GetTheAnswer() const { return sAnswer; } private: static int sAnswer; }; // monostate.cpp int MonoState::sAnswer = 42; 語 覓碁Д
  • 50. C++ 煙 蟆郁骸 螳 襴 覿螳 覈覈 蠏豺 螳豌 螳 煙 覿 襴 覃 曙 蟲覦讌
  • 51. // renderer.h #include <string> class IRenderer { public: virtual IRenderer() {} virtual bool LoadScene(const std::string &filename) 0; virtual void SetViewportSize(int w, int h) 0; virtual void SetCameraPosition(double x, double y, double z) 0; virtual void SetLookAt(double x, double y, double z) 0; virtual void Render() 0; };
  • 52. // rendererfactory.h #include "renderer.h" #include <string> class RendererFactory { public: IRenderer *CreateRenderer(const std::string &type); }; // rendererfactory.cpp #include "rendererfactory.h" #include "openglrenderer.h" #include "directxrenderer.h" #include "mesarenderer.h IRenderer *RendererFactory::CreateRenderer(const std::string &type) { if (type "opengl") return new OpenGLRenderer(); if (type "directx") return new DirectXRenderer(); if (type "mesa") return new MesaRenderer(); return NULL;
  • 53. 語ろ伎るゼ 壱 燕蠍 覓語 一 螻 企れ る 殊 襴襯 蟲 .cpp 殊襷 譟伎覃 public朱 碁 RenererFacory.h 殊 讌 蠏碁 願 蟆 襦 蠏碁 豌襴蠍磯ゼ 螻牛讌 覈詩.
  • 54. 襴 覃 企り 郁屋 蟯 螻襯 蟆 襷 壱 襦 企るゼ 豢螳 襦 企 螳豌 貊覦 郁屋る 襷旧 襴 企れ
  • 55. // rendererfactory.h #include "renderer.h" #include <string> #include <map> class RendererFactory { public: typedef IRenderer *(*CreateCallback)(); static void RegisterRenderer(const std::string &type, CreateCallback cb); static void UnregisterRenderer(const std::string &type); static IRenderer *CreateRenderer(const std::string &type); private: typedef std::map<std::string, CreateCallback> CallbackMap; static CallbackMap mRenderers; };
  • 56. #include "rendererfactory.h" // instantiate the static variable in RendererFactory RendererFactory::CallbackMap RendererFactory::mRenderers; void RendererFactory::RegisterRenderer(const std::string &type, CreateCallback cb) { mRenderers[type] cb; } void RendererFactory::UnregisterRenderer(const std::string &type) { mRenderers.erase(type); } IRenderer *RendererFactory::CreateRenderer(const std::string &type) { CallbackMap::iterator it mRenderers.find(type); if (it ! mRenderers.end()) { // call the creation callback to construct this derived type return (it >second)(); } return NULL; }
  • 57. class UserRenderer : public IRenderer { public: UserRenderer() {} bool LoadScene(const std::string &filename) { return true; } void SetViewportSize(int w, int h) {} void SetCameraPosition(double x, double y, double z) {} void SetLookAt(double x, double y, double z) {} void Render() { std::cout << "User Render" << std::endl; } static IRenderer *Create() { return new UserRenderer(); } }; int main(int, char **) { // register a new renderer RendererFactory::RegisterRenderer("user", UserRenderer::Create); // create an instance of our new renderer IRenderer *r RendererFactory::CreateRenderer("user"); r->Render(); delete r; return 0; }
  • 58. 企れ 誤壱伎るゼ 企殊伎誤語 螻 るジ 誤壱伎る 覲 企磯ゼ 伎覃 誤壱伎 誤 覓語 覓語 螳 企るれ 郁屋 .
  • 59. public class Adapter implements target{ request(){ translatedRequest(); } } 企殊伎誤語 企磯 襦 覿襴 襦 覦 伎 覈襴.
  • 60. 企一 蟆 誤壱伎るゼ蟲 企磯 企磯 蟲 覈 豌 企一蟆 public class Adapter implements target{ request(){ specificRequest(); } } 螳豌 蟲(Composition) 企一 企 觚企れ 伎 企 襯 る レ 企殊伎誤碁ゼ 轟 蟲 誤壱伎れ 郁屋 - 企 螳 - 蟆 誤壱伎る 襦 讌るる るジ 蟲 豢螳 螳
  • 61. れ 伎 企 磯ゼ 企一 貅 企 覈 觚企る 襷. 覦 れ襦 讌 貊 public class Adapter extends Target, Adaptee{ public void request(){ specificRequest(); } }
  • 62. - 企 豌企 れ 蟲讌 - 企一 る殊企 螳 - 蟲煙 蠍 覓語 蠏 觚企れ 伎 企
  • 63. 企 觚ろ 朱 誤壱伎れ 牛 誤壱伎るゼ 螻 殊 螻譴 誤壱伎るゼ 蠍 覓語 觚ろ 所
  • 64. 企 れ伎願係 1. 朱 蟯螻 (one-to-many) 襯 ロ螻 讌覦壱 蟆 譯殊 螳豌. 旧覯 螳螳 讌襷, 譯殊 螳豌伎 螳 覦る 蟆 れ手鍵襯 蠍磯るΜ 譯殊 譟 煙 螳讌. 2. 譟伎 1. 旧覯 譯殊 螳豌願 一危磯ゼ 螳煙 譯手鍵襯 蠍磯るΜ 願鍵 覓語 譟伎煙 螳讌. 2. 企 覦朱 誤 蟾 螳豌伎 語 襷 . update() <interface> Observer regosterObserver() { } removeObserver() { } notifyObservers() { } getState( ) setState( ) ConcreateSubject regosterObserver() removeObserver() notifyObservers() <interface> Subject update() //蠍壱 企 旧覯 覃 ConcreateObserver 旧覯 譯殊 旧覯螳 螳レ 螳豌企 企 誤壱伎 . 旧覯襯 焔//螻旧 蠍磯 襯 れ 覃螳 旧覯 螳豌伎 螳 覦覃 蠏 螳豌 譟危 るジ 螳豌企ろ 磯 螳螻 朱 伎 螳煙 覦朱 朱(one-to-many) 譟伎煙
  • 65. 旧覯 伎 譯殊 旧覯螳 蟆 蟆壱 螳豌 語 螻. 譯殊螳 旧覯 蟆 旧覯螳 轟 誤壱伎るゼ 蟲(implements) る 蟆 訖. 旧覯 語讌 襦 豢螳 襦 旧覯襯 豢螳り 譯殊襯 覲蟆 螳 . 譯殊 旧覯 襦 襴曙朱 . 譯殊 旧覯螳 覦朱 襦 レ 覩語讌 .