2018-01-01から1年間の記事一覧

EC++ #50, #51, #52 プレースメント new/delete

Effective C++ の 50, 51, 52項の内容です.本的には第8章をまるごと new/delete の話にさいていましたが,これを機会にちょっと new/delete の定義を見てみることにしました. new/delete とは? 下記,自分の環境にあった new/delete の宣言です. void* o…

#10 代入演算子は *this の参照を戻す

ということで,Effective C++の10項の内容です. コンストラクタ,コピーコンストラクタの暗黙呼び出し ということで,ちょっと内容とずれてしまうのですが寄り道です.そもそも,コンストラクタとかコピーコンストラクタってコンパイラが暗黙の呼び出しを…

#6 コンパイラが自動生成する関数を使用禁止する方法

ということで,Effective C++6項のお話です. コンパイラが自動で生成する関数 クラスを自作した時,明示的に自作関数を書かなければ下記の関数はコンパイラが自動生成するのでした. 1.コンストラクタ (Hoge()) 2.デストラクタ (~Hoge()) 3.コピ…

確率分布からの乱数の生成2 分布に従う乱数の発生,Box Muller法

ということで前回のエントリでは,下記の条件が既知の場合に変換後変数の確率密度分布を求める方法を考えました. 1.変換前の確率変数Xの確率密度関数がわかっている. 2.確率変数Xと確率変数Yの変換式Y=Φ(X) で,結果的に変換後の確率変数が従う分布 g(…

確率分布からの乱数の生成1 確率変数の変換

ということで,下記のエントリのGMappingの解剖実験進めているんですが,Motion Model の計算のところで正規分布に従う変数を生成する必要があったので簡単にまとめておくことにしました. 確率分布と分布に従う乱数の生成 平均値μ,分散σの正規分布が下記の…

#12 クラスのコピーの仕方3 STLコンテナを使うとき

Effective C++ 12項の内容+αの内容になりますが,STLのコンテナを使うときにコピーコンストラクタ・コピー代入演算子がどのように働くかを見てみます.下記のサンプルコードを作ってみました. #include <iostream> #include <memory> #include <cstring> #include <vector> class MyContainer </vector></cstring></memory></iostream>…

#12 クラスのコピーの仕方2 ディープコピー

ということで,Effective C++ 12項の内容の続きですが,ここでは自作コンテナを Deep Copy する例を取り上げます. ディープコピーのイメージ ディープコピーのイメージディープコピーした場合は,コピー元のオブジェクトとコピー先のオブジェクトになんの関…

#12 クラスのコピーの仕方1 シャローコピー

ということで,Effective C++の12項の内容なんですが,この辺自分もきちんと理解しきれてなかったのでまとめてみました. コピーの種類 オブジェクトをデザインするときに,コピーの振る舞いとか定義をどうするかを決めないといけないと思うんですが,大まか…

#35 仮想関数の代わりになるものを考える

Effective C++ #35 の内容です.この項はちょっと一風変わっていて,継承と仮想関数の仕組みを用いたシンプルなポリモーフィズムの実装を,異なるデザインパターンでおきかえる話でした.登場したデザインパターンとしては, 1.非仮想のインターフェースを…

SLAMのお勉強②−2 ~GMapping の環境設定

ということで,実際に ROS GMapping の解剖実験をするにあたって,環境を整えます.ROSのモジュールとして「ROSラッパー」「アルゴコア」の両方がきちんと管理されているので,そのまま catkin のパッケージとして落としてくれば,あとは catkin_make でビル…

SLAMのお勉強②−1 ~GMapping vs Google Cartographer

下記のエントリでSLAMの勉強をしているという話をしましたが,論文&本読みだけだとなかなか具体的なイメージが湧いてこないので,ソースコードも引っ張ってきて勉強することにしました.で,題材には下記の2つを使おうと思います.daily-tech.hatenablog.c…

#3(の2)可能ならいつでも const を使う.

Effective C++ 3項の内容です. const なメンバ関数とは?? 前回のエントリで変数に対する const の説明をしました.今回は,関数に対して使う const の説明です.クラスのメンバ関数に対して const をつけることによって,そのメソッドが当該オブジェクト…

#3(の1)可能ならいつでも const を使う.

Effective C++ 3項の内容です. const の使い方一覧 constがとても大事なことは,Effective C++も言っているし,とても良くわかるんですが,constの位置によってconstの対象が変わるのがなかなか覚えられません...一通りリストアップします. "const" for…

#24(の2) すべての引数に型変換が必要なら,非メンバ関数を定義する.

ということで前回エントリの続きです. 演算子の定義 前回整数値からRationalへの暗黙の型変換をするには,コンストラクタが使われていることを実験しました.今回はもう一歩進んで,掛け算の演算子オペレータを定義したいと思います.早速サンプルコードで…

#24(の1) すべての引数に型変換が必要なら,非メンバ関数を定義する.

ということで,Effective C++24項の内容です. コンストラクタと暗黙の型変換 Effective CPPでは,有理数の例を用いて暗黙の型変換が好まれる例を説明していました.他に簡単&適切な例が思いつかないので,ここでも有理数の例を用いて実験したいと思います…

#45 すべての互換型を受け取るために,メンバ関数テンプレートを使う

Effective C++ 45項の内容です. テンプレートで互換型を受け取るには? 「スマートポインタ(=リソース管理オブジェクト)を使えばリソースの破棄等を適切な範囲でやってくれるから,生のポインタを使わずにスマートポインタを使おう!」というのが #13 の…

#43 テンプレート化された基底クラスの名前へのアクセス方法

Effective C++ 43項の内容です. テンプレート化された基底クラスの名前は,派生クラスからは見えない. ということで,サンプルコードを見ていきます.まず,下記のような基底クラスと派生クラスがあったとします. class ElementA { public: void sayType(…

#33 継承した名前を隠蔽しない

Effective C++ 33項の内容です. 基底クラスにある名前は,派生クラスに同じ名前があると隠蔽される. 基底クラスにある名前は,派生クラスで同じ名前が使われるとアクセスできなくなります.下記,サンプルコードです. #include <iostream> class Base { public: cla</iostream>…

#42 typenameの2つの意味を理解する.

Effective C++ 42項の内容です. typenameの2つの用法 この項で述べられているtypenameの2つの意味ですが,下記です. 1. テンプレートパラメータの宣言として使う. 2. 「C++では,テンプレートパラメータ内部にあるネストされた依存型名はそのままでは型名…

#39 private 継承の使い方

Effective C++ 39項の内容です. private継承とは何ぞや? まず,private継承とはなんぞや?という話ですが,クラスの継承には public継承とprivate継承の2つがあります.だいたいpublic継承が使われていて,自分はprivate継承なんてあんまり見たことないん…

#34 インターフェースの継承と実装の継承を区別する.

Effective C++ 6章,34項の内容です. 関数の種類 関数の定義の仕方には下記の3種類があって,目的はそれぞれ次のようになります. 純粋仮想関数:派生クラスの作成者にインターフェースの実装を強制する.デフォルトの実装を提供することも可能であるが…

SLAMのお勉強① ~論文と関連書籍の整理&まとめ

以前のエントリでも書きましたが,今年は北陽電機さんのご厚意で UTM-30LX-EW を貸していただくことができ,ROSのフレームワークが使えるようになりました.daily-tech.hatenablog.comで,つくばチャレンジも終わり,,,3次元復元ネタに戻ろうかと思ったん…

#21 オブジェクトを戻すべき時に参照を戻さない

Effective C++ 4章21項の内容です. 1.ローカルなオブジェクトに対する参照戻し これも,よく考えるとそのとおりなんですが,テンパってるとやってしまいそうです...何を言っているかというと,例えば次のようなコードがあったとします. Hoge & loc…

#13 リソース管理にオブジェクトを使う

Effective C++ 3章13項の内容です. 1.リソース管理オブジェクトとは? 自分みたいに組み込み系をメインでやっている人って,C++をガンガン使うというよりはCを使っている人が多いと思います.Cだとやっぱり生のポインタに対してメモリをmallocで割り当…

#7 ポリモーフィズムのための基底クラスには仮想デストラクタを宣言する.

Effective C++ 2章7項の内容です. 1.仮想関数 そもそも仮想関数とは何か?という話ですが,クラスのメンバ関数として宣言するときに,関数の前にvirtualをつけてあげれば仮想関数になります.で,なんでこんなことするか?ですが,下記の状況で使いたく…

#5 デフォルト代入演算子とデフォルトコピーコンストラクタの振る舞い

Effective C++ の2章で,コピー代入演算子,コピーコンストラクタについて説明されてますが,そもそも自分でこの関数を書かないといけない時がどういう時かはっきりわかってませんでした(汗) ちょっとググッて下記のページを見つけ,yohshiy.blog.fc2.com…

#5 C++が自動で生成する関数(デフォルトコンストラクタ,コピーコンストラクタ,コピー代入演算子,デストラクタ)

今回の内容は Effective C++, 5項のまとめです.クラスに何も記述しないような実装をしても,C++によって自動で生成される関数があります.それが,タイトルの通り,,, コンストラクタ コピーコンストラクタ コピー代入演算子 デストラクタ です.これは,…

#2 #define よりも const, enum, inline を使おう

ちょっともう少し C++ をきちんと理解しないといけないな...と思うことがあり,ロボットも終わったちょうどいいタイミングなので,毎日少しづつ Effective C++ を読んで行くことにしました.ただ,読むだけだとどうも頭に入ってこないので,できるだけブ…

Visual Studio Code を使った C++ のビルド&デバッグ方法(with CMAKE)

前回のエントリでC++のファイルをビルド・デバッグする方法を扱いました.自分で一からファイルを作って,作ったファイルをすべて g++ の引数に渡してビルドして....ということもあるかもですが,大体は規模が大きくなってくると CMake を使うと思います…

Visual Studio Code を使った C++ のビルド&デバッグ方法

ということで,つくばチャレンジも一段落した今,ちょっと基礎的なエントリです.仕事では Visual Studio を使って Windows メインで開発をしてるんですが,エディアとか IDE とかってなれるまでに時間がかかリますよね...なのでちょっと億劫だったんです…