際際滷

際際滷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

What's hot (20)

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

Viewers also liked (20)

郁屋襴ろ 覦讌乏
郁屋襴ろ 覦讌乏郁屋襴ろ 覦讌乏
郁屋襴ろ 覦讌乏
jinho park
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
jinho park
觚覲企 螳覦 譴 蠍磯
觚覲企 螳覦 譴 蠍磯觚覲企 螳覦 譴 蠍磯
觚覲企 螳覦 譴 蠍磯
覩碁 豕
Publish Subscriber messaging pattern
Publish Subscriber messaging patternPublish Subscriber messaging pattern
Publish Subscriber messaging pattern
Shirish Bari
Pattern and EA
Pattern and EAPattern and EA
Pattern and EA
YoungSu Son
Team10:TenTen for blackboard
Team10:TenTen for blackboardTeam10:TenTen for blackboard
Team10:TenTen for blackboard
Jong-hoon Baek
Scalable system design patterns
Scalable system design patternsScalable system design patterns
Scalable system design patterns
Steve Min
Design pattern study 6 command pattern
Design pattern study 6 command patternDesign pattern study 6 command pattern
Design pattern study 6 command pattern
dragor0123
Observer pattern dragor
Observer pattern dragorObserver pattern dragor
Observer pattern dragor
dragor0123
Design patterns ろ磯 - Singleton
Design patterns ろ磯 - Singleton Design patterns ろ磯 - Singleton
Design patterns ろ磯 - Singleton
Hyunho-Cho
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
Daniel Lim
Design patterns ろ磯 -strategy
Design patterns ろ磯 -strategyDesign patterns ろ磯 -strategy
Design patterns ろ磯 -strategy
Hyunho-Cho
Arquitetura da plataforma com o Biztalk ServerArquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk Server
Markus Christen
Publisher subscriber pattern
Publisher subscriber patternPublisher subscriber pattern
Publisher subscriber pattern
DaeMyung Kang
Node Js Redis襯 蟲譟壱 一危
Node Js Redis襯  蟲譟壱 一危Node Js Redis襯  蟲譟壱 一危
Node Js Redis襯 蟲譟壱 一危
jinho park
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1
Daniel Lim
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
Daniel Lim
4. publish / subscribe
4. publish / subscribe4. publish / subscribe
4. publish / subscribe
seung-hyun Park
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
Daniel Lim
郁屋襴ろ 覦讌乏
郁屋襴ろ 覦讌乏郁屋襴ろ 覦讌乏
郁屋襴ろ 覦讌乏
jinho park
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
jinho park
觚覲企 螳覦 譴 蠍磯
觚覲企 螳覦 譴 蠍磯觚覲企 螳覦 譴 蠍磯
觚覲企 螳覦 譴 蠍磯
覩碁 豕
Publish Subscriber messaging pattern
Publish Subscriber messaging patternPublish Subscriber messaging pattern
Publish Subscriber messaging pattern
Shirish Bari
Pattern and EA
Pattern and EAPattern and EA
Pattern and EA
YoungSu Son
Team10:TenTen for blackboard
Team10:TenTen for blackboardTeam10:TenTen for blackboard
Team10:TenTen for blackboard
Jong-hoon Baek
Scalable system design patterns
Scalable system design patternsScalable system design patterns
Scalable system design patterns
Steve Min
Design pattern study 6 command pattern
Design pattern study 6 command patternDesign pattern study 6 command pattern
Design pattern study 6 command pattern
dragor0123
Observer pattern dragor
Observer pattern dragorObserver pattern dragor
Observer pattern dragor
dragor0123
Design patterns ろ磯 - Singleton
Design patterns ろ磯 - Singleton Design patterns ろ磯 - Singleton
Design patterns ろ磯 - Singleton
Hyunho-Cho
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
Daniel Lim
Design patterns ろ磯 -strategy
Design patterns ろ磯 -strategyDesign patterns ろ磯 -strategy
Design patterns ろ磯 -strategy
Hyunho-Cho
Arquitetura da plataforma com o Biztalk ServerArquitetura da plataforma com o Biztalk Server
Arquitetura da plataforma com o Biztalk Server
Markus Christen
Publisher subscriber pattern
Publisher subscriber patternPublisher subscriber pattern
Publisher subscriber pattern
DaeMyung Kang
Node Js Redis襯 蟲譟壱 一危
Node Js Redis襯  蟲譟壱 一危Node Js Redis襯  蟲譟壱 一危
Node Js Redis襯 蟲譟壱 一危
jinho park
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1
Daniel Lim
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
Daniel Lim
4. publish / subscribe
4. publish / subscribe4. publish / subscribe
4. publish / subscribe
seung-hyun Park
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
Daniel Lim

Similar to Api design for c++ 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
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 旧
ル旭 豕
Java 螳襭 ed11
Java 螳襭 ed11Java 螳襭 ed11
Java 螳襭 ed11
hungrok
覈伎危磯 C++ 3,4 , ろ磯
覈伎危磯 C++ 3,4 ,  ろ磯覈伎危磯 C++ 3,4 ,  ろ磯
覈伎危磯 C++ 3,4 , ろ磯
quxn6
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
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
SeungYeonChoi10
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
覓語
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
suitzero
Tcpl 14 語襴
Tcpl 14 語襴Tcpl 14 語襴
Tcpl 14 語襴
04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟
Wanbok Choi
Windows via c++ part 1
Windows via c++ part 1Windows via c++ part 1
Windows via c++ part 1
Shin heemin
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
SeungHyun Hwang
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
Dong Chan Shin
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
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 旧
ル旭 豕
Java 螳襭 ed11
Java 螳襭 ed11Java 螳襭 ed11
Java 螳襭 ed11
hungrok
覈伎危磯 C++ 3,4 , ろ磯
覈伎危磯 C++ 3,4 ,  ろ磯覈伎危磯 C++ 3,4 ,  ろ磯
覈伎危磯 C++ 3,4 , ろ磯
quxn6
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
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
SeungYeonChoi10
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
覓語
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
suitzero
Tcpl 14 語襴
Tcpl 14 語襴Tcpl 14 語襴
Tcpl 14 語襴
04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟04 襦企 襦蠏碁 蟲譟
04 襦企 襦蠏碁 蟲譟
Wanbok Choi
Windows via c++ part 1
Windows via c++ part 1Windows via c++ part 1
Windows via c++ part 1
Shin heemin
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
SeungHyun Hwang
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
Dong Chan Shin

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) る 蟆 訖. 旧覯 語讌 襦 豢螳 襦 旧覯襯 豢螳り 譯殊襯 覲蟆 螳 . 譯殊 旧覯 襦 襴曙朱 . 譯殊 旧覯螳 覦朱 襦 レ 覩語讌 .