Fóruns: VC++公開討議 (Thread #32274)

IntelHEXFile.cppのinitializeはどうのように呼び出されている? (2012-05-30 18:03 by blackzoro #64080)

皆様お世話になっております。

現在、intelhexutilのプログラムを見ていて思ったのですが、


{code}
int main(int argc, char** argv) {

//argc = 1;
//argv[0] = C:\mywork\new_wireless_module\open\cc1101driver\trunk\VC_test\intelhexutil\eeprom_data_sn11002.hex;


IntelHEXFilePtr file(get_file(argc, argv));

--------(中略)----------------------------------------------------------

{code}


ここで”IntelHEXFilePtr file(get_file(argc, argv));”
というのを呼び出していますが、デバッグでステップ実行でいろいろと追ってみたのですが、class IntelHEXFileImplクラスの


{code}
void initialize(istream& stream) {
string line;
while (getline(stream, line)) {
records.push_back(IntelHEXRecordPtr(new IntelHEXRecord(line)));
}
}

{code}


このinitializeというところでgetlineでファイルに存在するテキスト行を最後まで読み取っていくようなプログラムに行くまでの過程がものすごく複雑に感じていています。

このvoid initialize(istream& stream)というのがどこで呼び出されているのかなど教えて頂けませんでしょうか。

Responder a #64080×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: IntelHEXFile.cppのinitializeはどうのように呼び出されている? (2012-06-05 00:24 by toy_dev #64163)

トゥイーです。

initialize の getline でファイルに存在するテキスト行を最後まで読み取っていくという流れはあっています。

これを書くのに C++ の2つの定石(慣習)を使っています。使っている定石は以下の2つです。

1.スマートポインタを使う。
2.PImpl イディオムを使う。

まず、boost::shared_ptr を使った XxxPtr というやつですが、これは new で割り当てたメモリを自動で delete してくれるものです。
自動削除してくれるので「スマート」なポインタと呼ばれています。
メモリリークを防ぐために良く使う基本的な技です。
表面上はポインタと同じ動きをするので、内部の詳細な途中経過は読み飛ばして省いてかまいません。

ptr->method();

と書いてあったら、途中に処理を色々とはさみますが、最終的に method メソッドが呼び出されるので、
呼び出される先のメソッドにブレークポイントを置いて読んで見てください。

次に PImpl イディオムですが、内部的な実装(cpp)と表面上のクラス定義(hpp)を分離するためのものです。
C++ はプログラムが大きくなって複雑になると cpp と hpp との依存関係の嵐でコンパイルが困難になります。
それを避けるための定石です。

P クラスというのがあったら対となる Pimpl クラスを cpp 内でのみ実装するという方法を取ります。
流れとしては

IntelHexFile のコンストラクタで IntelHexFileImpl のインスタンスを new していますね?
すると IntelHexFileImpl のコンストラクタが呼ばれ initialize が呼び出されます。

整理すると

IntelHexFile の new => IntelHexFileImpl の new => initialize

の流れです。

ファイル名(std::string)を指定する場合は、ストリームを指定する場合の両方を考慮して
コンストラクタは2つにし、共通処理として initialize メソッドを定義しています。

ちょっと複雑な説明ですが、わかりましたでしょうか?

知っているとよくやる書き方なのですが、知らないと確かにちょっと難しいです。
Responder a #64080

Responder a #64163×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login