Dec13th

C++

Top / C++

まとめ

  • クラス演算子の外部定義
    • operatorの前にクラススコープを付けるだけ。
  • assert()
    • #include <cassert>
    • 引数が0の時強制停止
    • 条件式に&&でメッセージを結合できる
      • メッセージ単体で出したい場合は0 && "メッセージ"にしないと止まらない
  • ウィンドウのクライアント領域イメージ取得 @Windows
    • ほとんどここと一緒
    • cv::Matへの変換は、Mat::dataにuchar*にキャストしたlpPixelを入れた後にcv::flip()で反転
       
  • スマートポインタ版Singleton(boost::shared_ptrの場合)
    • GetInstance():自身を指すポインタでreset()を呼び、新しいインスタンスを割り当ててから返す
    • privateデストラクタで解放処理
  • std::vector領域確保関連
    • http://dvdm.blog134.fc2.com/blog-entry-62.html
    • resize()
      領域確保+オブジェクト生成
    • reserve()
      領域確保
    • size()
      オブジェクトとして初期化されている個数
    • capacity()
      領域確保されている数
      これ以上にpush_back()しようとすると領域を取りに行く(現在の2倍)ため処理時間がかかる
  • ラムダ式
    [変数キャプチャ](引数){処理コード}
    関数オブジェクト。autoで受けられる
    戻り値はreturn文の型になる


メモ

  • 演算子オーバーロードを行う際に、自身の変更が無い場合はconstを付けるべき
    res = op1 * op2のような式でop1がconstの場合、指定が無いとコンパイルエラーになる
  • ポインタ配列(**)へのnewでは、ポインタ自体は連続的に配置されるっぽいがその先のインスタンスが連続的に配置される保証はない(というかほとんど無理)
    • インスタンスを連続的に配置するには?
  • NULL 参照ポインターがスタブに渡されました
    • ShowWindow()前にCoInitializeEx()を呼んでおく必要があるらしい
    • COMオブジェクト使用後はCoUnInitialize()も呼んでおくべきっぽい
  • 多クラスへの参照を書く場合は、基本的にinlineを付けられない
    • 循環参照が回避できない
  • inlineを付ける場合.cppでの実装はできない
    • 実装部を見失う
  • Getter、Setterのinline化はお作法としては良くない
    • inlineにするくらい速度気にするならpublicにしろやと言う話
  • あるクラスAへの参照を持つクラスは、Aのコンストラクタ内で初期化してはいけない
  • <windows.h>のFindWindow()の第二引数にウィンドウタイトルを渡すとウィンドウハンドルを取得できる
  • 先行宣言してるクラスのメンバへのアクセスコードはヘッダに書けない
    • .cppに回せばコンパイルできる
  • classのインスタンスを生成する場合、先行宣言だけでは足りない
    • 先行宣言はポインタ宣言のために使うぐらいしかできない
  • std::mapを[]でアクセスしようとして登録してないキーを使うと、そのキーとvalue型のデフォルトコンストラクタで要素を勝手に作ってしまうっぽい
    • いつの間にかmap内が要素だらけって可能性も有りうる
    • find(キー)とend()の比較でそのキーを持つ要素があるかどうかの判定ができる
  • std::mapのvalueにboost::shared_ptrを乗せている時、keyに無効な値を渡すとnullptrが返ってくる
    • たぶん全部の型共通で0かnullになりそう
  • Singletonクラスの継承は(基本的に)できない
  • virtualなデストラクタを持たないクラスを継承してはいけない
  • stringstreamの文字列リセットはss.str("")
  • VC++ではtemplateの実装をヘッダに書かなくてはならない
  • std::string::size()とstd::string::length()の動作に差はない
  • スーパークラスのコンストラクタの明示的呼び出しは初期化子を使って行う
  • namespaceブロックでtypedefされた型名は、その空間内扱いになる
  • メンバ関数にデフォルトパラメータを与えるのは宣言時のみ


未解決問題

  • 型を表す変数からnew呼び出し
    • Factory系パターンで任意型の生成を行いたい
  • Product名がソフトコーディングされたFactoryパターン
    • Product名自体もスクリプト化したい
  • Singletonの継承
  • boost::shared_ptr<T>のPtr<T>への隠蔽(?) [#ze8ea4bf]
    • 基本
      • templateのtypedefはできない
    • defineの場合
      • 名前空間抜ける
      • 変数宣言時にエラー
    • 継承の場合
      • コンストラクタによる動作が制限
      • privateデストラクタが呼べない⇒Singleton時に困る

リンク