際際滷

際際滷Share a Scribd company logo
蠖
http://cafe.naver.com/architect1
覦讌
http://blog.naver.com/jinojjan
 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++ ch3 pattern
 Lazy Instance 覈  貊螳 ろ ,
main()  語蠍 企 覡ろ 蠍朱
API螳 豐蠍壱  豐蠍壱
  豐蠍壱
static Singleton& foo = Singleton::GetInstance();
 覈 API 豐蠍壱
Void APIInitialize()
{
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

What's hot (20)

伎 覲襦蠏碁覦
伎 覲襦蠏碁覦伎 覲襦蠏碁覦
伎 覲襦蠏碁覦
Yong Joon Moon
願 覦 Chap. 6 企(CLASS)(KOR)
願 覦 Chap. 6 企(CLASS)(KOR)願 覦 Chap. 6 企(CLASS)(KOR)
願 覦 Chap. 6 企(CLASS)(KOR)
MIN SEOK KOO
Swift3 typecasting nested_type
Swift3 typecasting nested_typeSwift3 typecasting nested_type
Swift3 typecasting nested_type
Eunjoo Im
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
Eunjoo Im
れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)
れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)
れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)
Yongha Yoo
危磯 C++ 螻給
危磯 C++ 螻給危磯 C++ 螻給
危磯 C++ 螻給
quxn6
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
Eunjoo Im
Java lambda
Java lambdaJava lambda
Java lambda
Hyosang Hong
C++ Advanced 螳 4譯殊姶
 C++ Advanced 螳 4譯殊姶 C++ Advanced 螳 4譯殊姶
C++ Advanced 螳 4譯殊姶
HyunJoon Park
願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)
願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)
願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)
MIN SEOK KOO
危磯 C++ ろ磯
危磯 C++ ろ磯危磯 C++ ろ磯
危磯 C++ ろ磯
quxn6
危磯 C++ 5,6 ろ磯
危磯 C++ 5,6  ろ磯危磯 C++ 5,6  ろ磯
危磯 C++ 5,6 ろ磯
quxn6
蠍壱, れ譴襷
蠍壱, れ譴襷蠍壱, れ譴襷
蠍壱, れ譴襷
xxbdxx
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
Leonardo YongUk Kim
Effective c++ 襴 chapter 4
Effective c++ 襴 chapter 4Effective c++ 襴 chapter 4
Effective c++ 襴 chapter 4
一 蟾
危磯 C++ (7~9)
危磯 C++ (7~9)危磯 C++ (7~9)
危磯 C++ (7~9)
旧 譟
=求メ =戟 求≡=
=求メ =戟 求≡= =求メ =戟 求≡=
=求メ =戟 求≡=
Yong Joon Moon
0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)
0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)
0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)
Sung-hoon Ma
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
煙 蟾
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
煙 蟾
伎 覲襦蠏碁覦
伎 覲襦蠏碁覦伎 覲襦蠏碁覦
伎 覲襦蠏碁覦
Yong Joon Moon
願 覦 Chap. 6 企(CLASS)(KOR)
願 覦 Chap. 6 企(CLASS)(KOR)願 覦 Chap. 6 企(CLASS)(KOR)
願 覦 Chap. 6 企(CLASS)(KOR)
MIN SEOK KOO
Swift3 typecasting nested_type
Swift3 typecasting nested_typeSwift3 typecasting nested_type
Swift3 typecasting nested_type
Eunjoo Im
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
Eunjoo Im
れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)
れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)
れ, 貊襴郁骸 覈語伎 轟 (Swift, Kotlin and Modern Languages)
Yongha Yoo
危磯 C++ 螻給
危磯 C++ 螻給危磯 C++ 螻給
危磯 C++ 螻給
quxn6
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
Eunjoo Im
C++ Advanced 螳 4譯殊姶
 C++ Advanced 螳 4譯殊姶 C++ Advanced 螳 4譯殊姶
C++ Advanced 螳 4譯殊姶
HyunJoon Park
願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)
願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)
願 覦 Chap.11 蠍磯蓋 API 企(java)(KOR)
MIN SEOK KOO
危磯 C++ ろ磯
危磯 C++ ろ磯危磯 C++ ろ磯
危磯 C++ ろ磯
quxn6
危磯 C++ 5,6 ろ磯
危磯 C++ 5,6  ろ磯危磯 C++ 5,6  ろ磯
危磯 C++ 5,6 ろ磯
quxn6
蠍壱, れ譴襷
蠍壱, れ譴襷蠍壱, れ譴襷
蠍壱, れ譴襷
xxbdxx
Effective c++ 襴 chapter 4
Effective c++ 襴 chapter 4Effective c++ 襴 chapter 4
Effective c++ 襴 chapter 4
一 蟾
危磯 C++ (7~9)
危磯 C++ (7~9)危磯 C++ (7~9)
危磯 C++ (7~9)
旧 譟
=求メ =戟 求≡=
=求メ =戟 求≡= =求メ =戟 求≡=
=求メ =戟 求≡=
Yong Joon Moon
0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)
0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)
0.逮温厩温壊界姻庄沿岳蠍磯蓋(簡3殊姶)
Sung-hoon Ma
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
煙 蟾
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
煙 蟾

Viewers also liked (20)

2 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-30
2 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-302 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-30
2 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-30
Donghan Kim
Node Js Redis襯 蟲譟壱 一危
Node Js Redis襯  蟲譟壱 一危Node Js Redis襯  蟲譟壱 一危
Node Js Redis襯 蟲譟壱 一危
jinho park
伎 蟲 2017 る誤 : Back to the Basic
伎 蟲 2017 る誤 : Back to the Basic伎 蟲 2017 る誤 : Back to the Basic
伎 蟲 2017 る誤 : Back to the Basic
Hyun-woo Park
NoSQL 覈碁
NoSQL 覈碁NoSQL 覈碁
NoSQL 覈碁
Hoyong Lee
TRIZ
TRIZTRIZ
TRIZ
Il-woo Lee
覲伎矧
覲伎矧覲伎矧
覲伎矧
Il-woo Lee
NoSQL Database
NoSQL DatabaseNoSQL Database
NoSQL Database
Steve Min
NoSQL distilled NoSQL瑚
NoSQL distilled  NoSQL瑚NoSQL distilled  NoSQL瑚
NoSQL distilled NoSQL瑚
Choonghyun Yang
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
Hyun-woo Park
Docker..30 m
Docker..30 mDocker..30 m
Docker..30 m
Wonchang Song
NoSQL 覿 Slamdata
NoSQL 覿 SlamdataNoSQL 覿 Slamdata
NoSQL 覿 Slamdata
Pikdata Inc.
NoSQL
NoSQL NoSQL
NoSQL
NAVER D2
[NoSQL] 2. 讌 一危 覈
[NoSQL] 2. 讌 一危 覈[NoSQL] 2. 讌 一危 覈
[NoSQL] 2. 讌 一危 覈
kidoki
No sql 5 手
No sql 5   手No sql 5   手
No sql 5 手
rooya85
螳語覲 觜覲 蠍一 覦 襷
螳語覲 觜覲 蠍一  覦 襷 螳語覲 觜覲 蠍一  覦 襷
螳語覲 觜覲 蠍一 覦 襷
Donghan Kim
Express
Express Express
Express
Choonghyun Yang
Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)
Steve Min
No sql 覿磯
No sql 覿磯No sql 覿磯
No sql 覿磯
Choonghyun Yang
NoSQL distilled.蠏碁 一危磯伎
NoSQL distilled.蠏碁 一危磯伎NoSQL distilled.蠏碁 一危磯伎
NoSQL distilled.蠏碁 一危磯伎
Choonghyun Yang
2 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-30
2 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-302 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-30
2 願鍵碁碁-no sql(覦壱)-d-hankim-2013-4-30
Donghan Kim
Node Js Redis襯 蟲譟壱 一危
Node Js Redis襯  蟲譟壱 一危Node Js Redis襯  蟲譟壱 一危
Node Js Redis襯 蟲譟壱 一危
jinho park
伎 蟲 2017 る誤 : Back to the Basic
伎 蟲 2017 る誤 : Back to the Basic伎 蟲 2017 る誤 : Back to the Basic
伎 蟲 2017 る誤 : Back to the Basic
Hyun-woo Park
NoSQL 覈碁
NoSQL 覈碁NoSQL 覈碁
NoSQL 覈碁
Hoyong Lee
NoSQL Database
NoSQL DatabaseNoSQL Database
NoSQL Database
Steve Min
NoSQL distilled NoSQL瑚
NoSQL distilled  NoSQL瑚NoSQL distilled  NoSQL瑚
NoSQL distilled NoSQL瑚
Choonghyun Yang
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
Hyun-woo Park
NoSQL 覿 Slamdata
NoSQL 覿 SlamdataNoSQL 覿 Slamdata
NoSQL 覿 Slamdata
Pikdata Inc.
[NoSQL] 2. 讌 一危 覈
[NoSQL] 2. 讌 一危 覈[NoSQL] 2. 讌 一危 覈
[NoSQL] 2. 讌 一危 覈
kidoki
No sql 5 手
No sql 5   手No sql 5   手
No sql 5 手
rooya85
螳語覲 觜覲 蠍一 覦 襷
螳語覲 觜覲 蠍一  覦 襷 螳語覲 觜覲 蠍一  覦 襷
螳語覲 觜覲 蠍一 覦 襷
Donghan Kim
Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)Apache Spark Overview part2 (20161117)
Apache Spark Overview part2 (20161117)
Steve Min
NoSQL distilled.蠏碁 一危磯伎
NoSQL distilled.蠏碁 一危磯伎NoSQL distilled.蠏碁 一危磯伎
NoSQL distilled.蠏碁 一危磯伎
Choonghyun Yang

Similar to Api design for c++ ch3 pattern (20)

Effective c++ 1~8
Effective c++ 1~8 Effective c++ 1~8
Effective c++ 1~8
Shin heemin
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
覓語
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin
Java 螳襭 ed11
Java 螳襭 ed11Java 螳襭 ed11
Java 螳襭 ed11
hungrok
Effective c++ chapter 1,2
Effective c++ chapter 1,2 Effective c++ chapter 1,2
Effective c++ chapter 1,2
Nam Hyeonuk
覈 危磯 c++ 5 ろ磯
覈 危磯 c++ 5 ろ磯覈 危磯 c++ 5 ろ磯
覈 危磯 c++ 5 ろ磯
quxn6
Modern C++ 襦蠏碁襾碁ゼ CPP11/14 旧
Modern C++ 襦蠏碁襾碁ゼ  CPP11/14 旧Modern C++ 襦蠏碁襾碁ゼ  CPP11/14 旧
Modern C++ 襦蠏碁襾碁ゼ CPP11/14 旧
ル旭 豕
More Effective C++ 4譯殊姶
More Effective C++ 4譯殊姶More Effective C++ 4譯殊姶
More Effective C++ 4譯殊姶
Injae Lee
[Gpg2蟠]1.1 c++ 蟆 豕
[Gpg2蟠]1.1 c++ 蟆 豕[Gpg2蟠]1.1 c++ 蟆 豕
[Gpg2蟠]1.1 c++ 蟆 豕
KyeongWon Koo
覈伎危磯 C++ 3,4 , ろ磯
覈伎危磯 C++ 3,4 ,  ろ磯覈伎危磯 C++ 3,4 ,  ろ磯
覈伎危磯 C++ 3,4 , ろ磯
quxn6
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
SeungYeonChoi10
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
suitzero
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
覓語
Tcpl 14 語襴
Tcpl 14 語襴Tcpl 14 語襴
Tcpl 14 語襴
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
SeungHyun Hwang
Windows via c++ part 1
Windows via c++ part 1Windows via c++ part 1
Windows via c++ part 1
Shin heemin
04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟
Wanbok Choi
求戟梶梶≡求釈求午 7
求戟梶梶≡求釈求午 7求戟梶梶≡求釈求午 7
求戟梶梶≡求釈求午 7
Yeonah Ki
Effective c++ 1~8
Effective c++ 1~8 Effective c++ 1~8
Effective c++ 1~8
Shin heemin
Effective c++ Chapter1,2
Effective c++ Chapter1,2Effective c++ Chapter1,2
Effective c++ Chapter1,2
覓語
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin
Java 螳襭 ed11
Java 螳襭 ed11Java 螳襭 ed11
Java 螳襭 ed11
hungrok
Effective c++ chapter 1,2
Effective c++ chapter 1,2 Effective c++ chapter 1,2
Effective c++ chapter 1,2
Nam Hyeonuk
覈 危磯 c++ 5 ろ磯
覈 危磯 c++ 5 ろ磯覈 危磯 c++ 5 ろ磯
覈 危磯 c++ 5 ろ磯
quxn6
Modern C++ 襦蠏碁襾碁ゼ CPP11/14 旧
Modern C++ 襦蠏碁襾碁ゼ  CPP11/14 旧Modern C++ 襦蠏碁襾碁ゼ  CPP11/14 旧
Modern C++ 襦蠏碁襾碁ゼ CPP11/14 旧
ル旭 豕
More Effective C++ 4譯殊姶
More Effective C++ 4譯殊姶More Effective C++ 4譯殊姶
More Effective C++ 4譯殊姶
Injae Lee
[Gpg2蟠]1.1 c++ 蟆 豕
[Gpg2蟠]1.1 c++ 蟆 豕[Gpg2蟠]1.1 c++ 蟆 豕
[Gpg2蟠]1.1 c++ 蟆 豕
KyeongWon Koo
覈伎危磯 C++ 3,4 , ろ磯
覈伎危磯 C++ 3,4 ,  ろ磯覈伎危磯 C++ 3,4 ,  ろ磯
覈伎危磯 C++ 3,4 , ろ磯
quxn6
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
SeungYeonChoi10
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
suitzero
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
覓語
Tcpl 14 語襴
Tcpl 14 語襴Tcpl 14 語襴
Tcpl 14 語襴
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
SeungHyun Hwang
Windows via c++ part 1
Windows via c++ part 1Windows via c++ part 1
Windows via c++ part 1
Shin heemin
04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟
Wanbok Choi
求戟梶梶≡求釈求午 7
求戟梶梶≡求釈求午 7求戟梶梶≡求釈求午 7
求戟梶梶≡求釈求午 7
Yeonah Ki

Api design for c++ ch3 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 豐蠍壱 Void APIInitialize() { 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) る 蟆 訖. 旧覯 語讌 襦 豢螳 襦 旧覯襯 豢螳り 譯殊襯 覲蟆 螳 . 譯殊 旧覯 襦 襴曙朱 . 譯殊 旧覯螳 覦朱 襦 レ 覩語讌 .

Editor's Notes

  • #6: 譬 覈 願 覲 る殊 企┯螳 企 襦 るジ 弰 ル讌 蟲豌伎 伎れ 語
  • #7: Private 企る AutoTime 企れ 覃襷 Impl 企れ 覃る 蠏 る 譟郁唄 Cpp 殊 るジ 企 螳 Iimpl企れ 覃る 蠏狩螻 蟆曙 public朱 Impl 蠏
  • #10: Pimpl 覿ク覃伎 所 る襯 覦る 伎 螳豌伎 覃覈襴 濠骸 伎螳 蠍 覓 Shared_ptr 伎 濠骸 伎 蟆 一 襦 . 轟 scoped_ptr . 願 覲旧螳 覿螳ロ覃 願 覃 private 覲旧 煙 覦 一一襯 誤讌 蠍 覓.
  • #11: 覲危ク朱 2覯 覈 蠍 蟠.
  • #22: 覃覈襴襴 覓語 讌朱 覃覈襴 轟 殊企 伎 覦 覓語伎 螳豌 豌 覯襷 焔 襦蠏碁 譬襭 蟾讌 讌 螳豌企 覓語螳 讌
  • #23: static storage duration 覦蟾レ 覲 れ static 覲 Automatic storage duration 襷り覲襯 碁 覲. 蠏碁れ 觚襦朱 れ願 焔 伎 dynamic storage duration new 一一襯 豪 覃覈襴 delete 一一襦 伎蟇磯 襦蠏碁 譬襭 蟾讌 譟伎
  • #36: 磯螳 炎 螳豌企ゼ 燕 蟆曙, 襷讌襷 焔 炎 螳豌企 朱 螻, 蠏 焔 螳豌企 蟆 覩襦, 炎 螳豌企ゼ 燕 , 磯 襦
  • #37: 磯螳 炎 螳豌企ゼ 燕 蟆曙, 襷讌襷 焔 炎 螳豌企 朱 螻, 蠏 焔 螳豌企 蟆 覩襦, 炎 螳豌企ゼ 燕 , 磯 襦
  • #38: 磯螳 炎 螳豌企ゼ 燕 蟆曙, 襷讌襷 焔 炎 螳豌企 朱 螻, 蠏 焔 螳豌企 蟆 覩襦, 炎 螳豌企ゼ 燕 , 磯 襦
  • #39: 磯螳 炎 螳豌企ゼ 燕 蟆曙, 襷讌襷 焔 炎 螳豌企 朱 螻, 蠏 焔 螳豌企 蟆 覩襦, 炎 螳豌企ゼ 燕 , 磯 襦
  • #40: 語 襷 曙 蟇碁Μ蠍 覓語 焔 覓語 覦
  • #53: Irenderer 企るゼ 覦 OpenglRenderer, DirectxRenderer, MesaRenderer 瑚 企るゼ 蟲り 螳
  • #58: 譯殊 : Create() 襯 UserRenderer 企れ 豢螳 覿覿 襴 RegisterRenderer 螳豌企ゼ 襴危 貊覦 襯 豬 貊覦 Irenderer 企れ 覃る螳 伎 蠍 覓語 static朱 .