ブックマーク / tercel-tech.hatenablog.com (2)

  • C++のPimplイディオム - たーせる日記

    最近読んだ『C++のためのAPIデザイン』というに興味深い技法が紹介されていてちょっと感動したので備忘録。 きっかけ C++で、あるクラスのヘッダを以下のように書いたとしましょう。 MyClass.h #ifndef MyClass_h #define MyClass_h class MyClass { public: MyClass(); virtual ~MyClass(); private: // API利用者に使わせたくない関数 void privateFunc(); }; #endif このとき、MyClassの利用者には「privateFunc()」というメンバ関数の存在が丸見えになってしまっています。 利用者は人様が作ったクラスのアクセス指定子を無効化する手段を持っているため、たとえば以下のように書くと、なんとMyClassの外側から合法的にprivateメンバにアクセスで

    C++のPimplイディオム - たーせる日記
  • コピーコンストラクタ、代入演算子、デストラクタ - たーせる日記

    C++のためのAPIデザイン』のp.210には、こんな記述があります。 C++の初心者が陥りやすいのは、リソースを割り当てるクラスを作り、それに伴いデストラクタは用意したが、コピーコンストラクタと代入演算子を定義しないことだ。 というわけで、今日はコピーコンストラクタと代入演算子の定義がないと何が起こるのかについて実験してみます。 きっかけ 『ゲームプログラマになる前に覚えておきたい技術』のp.520には即死サンプルという不穏当なコードが掲載されています。 #include <vector> using namespace std; class A { public: A() { mX = new int(); } ~A() { delete mX; } int* mX; }; vector< A > gA; // グローバルにvector void add() { // 配列に足す関数

    コピーコンストラクタ、代入演算子、デストラクタ - たーせる日記
    ogamita777
    ogamita777 2016/02/07
    “#include <vector> using namespace std; class A { public: A() { mX = new int(); } ~A() { delete mX; } int* mX; }; vector< A > gA; // グローバルにvector void add() { // 配列に足す関数 A a; gA.push_back( a ); } int main() { add(); *( gA[ 0 ].mX ) = 6; return 0; }”
  • 1