<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++</title><link>http://blogs.wankuma.com/kazuki/category/1687.aspx</link><description>C++</description><managingEditor>k.ota.0130あっとgmail.com(かずき)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>k.ota.0130@gmail.com(かずき)</dc:creator><title>[WPF][C#]WPFのDataGridの行ヘッダでのダブルクリックイベント</title><link>http://blogs.wankuma.com/kazuki/archive/2010/05/19/189207.aspx</link><pubDate>Wed, 19 May 2010 23:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2010/05/19/189207.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/189207.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2010/05/19/189207.aspx#Feedback</comments><slash:comments>313</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/189207.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/189207.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/WPF"&gt;WPF&lt;/a&gt;のDataGridの行ヘッダで&lt;a href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%D6%A5%EB%A5%AF%A5%EA%A5%C3%A5%AF"&gt;ダブルクリック&lt;/a&gt;されたことを検知したいとき。 &lt;p&gt;とりあえず、&lt;a href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A6%A5%B9"&gt;マウス&lt;/a&gt;の位置からRowHeaderActualWidthより左にあるかどうかで判断してみた。 &lt;p&gt;&lt;a href="http://d.hatena.ne.jp/okazuki/20100519/1274279370"&gt;続きを読む&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/189207.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF]C++でWPF</title><link>http://blogs.wankuma.com/kazuki/archive/2009/11/22/183227.aspx</link><pubDate>Sun, 22 Nov 2009 13:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2009/11/22/183227.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/183227.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2009/11/22/183227.aspx#Feedback</comments><slash:comments>639</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/183227.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/183227.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/C%2b%2b"&gt;C++&lt;/a&gt;といっても普通の&lt;a href="http://d.hatena.ne.jp/keyword/C%2b%2b"&gt;C++&lt;/a&gt;じゃなくて&lt;a href="http://d.hatena.ne.jp/keyword/C%2b%2b/CLI"&gt;C++/CLI&lt;/a&gt;です。  &lt;p&gt;まず、&lt;a href="http://d.hatena.ne.jp/keyword/WPF"&gt;WPF&lt;/a&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%a5%a2%a5%d7%a5%ea%a5%b1%a1%bc%a5%b7%a5%e7%a5%f3"&gt;アプリケーション&lt;/a&gt;の&lt;a href="http://d.hatena.ne.jp/keyword/%a5%c6%a5%f3%a5%d7%a5%ec%a1%bc%a5%c8"&gt;テンプレート&lt;/a&gt;はないので、空の&lt;a href="http://d.hatena.ne.jp/keyword/CLR"&gt;CLR&lt;/a&gt;プロジェクトを作成します。ここでは、プロジェクトの名前を「WPFCppEdu」にしました。  &lt;p&gt;プロジェクトの&lt;a href="http://d.hatena.ne.jp/keyword/%a5%d7%a5%ed%a5%d1%a5%c6%a5%a3"&gt;プロパティ&lt;/a&gt;を設定していきます。  &lt;p&gt;&lt;a href="http://d.hatena.ne.jp/okazuki/20091121/1258823091"&gt;続きを読む&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/183227.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[Other][C++]MFCって最近凄いのなぁ</title><link>http://blogs.wankuma.com/kazuki/archive/2008/10/22/159608.aspx</link><pubDate>Wed, 22 Oct 2008 21:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/10/22/159608.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/159608.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/10/22/159608.aspx#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/159608.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/159608.aspx</trackback:ping><description>&lt;p&gt;MFC Feature Packって騒がれてた記事をチラホラ見てたけど、今日実際にプロジェクトの雛形作ってみた。&lt;br&gt;（VS2008 std買ったから試せるということをすっかり忘れてた…ずっとExpress使ってたので…）&lt;/p&gt; &lt;p&gt;とまぁ、雛形作って実行してみてスゲースゲーって思ったけどカスタマイズしてアプリケーションに仕立てようと思うとちょっと大変そう…&lt;br&gt;書籍が欲しくなるというか、自分がMFCのことを綺麗さっぱり忘れてることを認識させられてションボリな今日この頃でした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/159608.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++]時間を計測したいのですよ その２</title><link>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144545.aspx</link><pubDate>Thu, 19 Jun 2008 23:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144545.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/144545.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144545.aspx#Feedback</comments><slash:comments>45</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/144545.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/144545.aspx</trackback:ping><description>&lt;p&gt;とりあえず動いた！！&lt;br&gt;ってので乗っけたらいっぱいコメントがついてた。&lt;br&gt;時間の計測の部分とそうでない部分にわかれるけど、そうでない部分は今回は保留。&lt;/p&gt; &lt;p&gt;とりあえず、何も考えずに割りと高性能っぽいタイマーを使うとなるとこうなる&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c2219837-5852-4d10-9ee5-4a6598fb1416" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;windows.h&amp;gt;

int main(int argc, char **argv)
{
	LARGE_INTEGER start;
	LARGE_INTEGER end;
	LARGE_INTEGER freq;
	QueryPerformanceFrequency(&amp;amp;freq);
	QueryPerformanceCounter(&amp;amp;start);
	// 何かの処理
	QueryPerformanceCounter(&amp;amp;end);

	double time = ((double) end.QuadPart - (double) start.QuadPart) / (double) freq.QuadPart;
	std::cout &amp;lt;&amp;lt; "処理時間: " &amp;lt;&amp;lt; time &amp;lt;&amp;lt; "sec" &amp;lt;&amp;lt; std::endl;
	return 0;
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ただ、これだとBIOSとかのバグのせいでマルチCPU環境だとうまく動かないことがありますとのこと。&lt;br&gt;MSDNにもばっちり書いてあるけど、肝心の何関数を使えっていうところで関数名が消えてるorz&lt;/p&gt;
&lt;p&gt;英語のほうを見るとSetThreadAffinityMaskという関数を呼べばいいらしい。&lt;br&gt;SetThreadAffinityMaskは、第一引数にスレッドのハンドルで、第二引数がスレッドにどのCPU使わせるかのマスクっぽい？（自信無い）&lt;/p&gt;
&lt;p&gt;1(0001)だと1つ目のCPU&lt;br&gt;2(0010)だと2つ目のCPU&lt;br&gt;4(0100)だと3つ目のCPU&lt;br&gt;といった具合になるのだろう。&lt;/p&gt;
&lt;p&gt;ということで、こんな具合にやるのがとりあえず確実っぽい。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:35016f45-968a-4149-9ea2-3c1876e2a60d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;windows.h&amp;gt;

int main(int argc, char **argv)
{
	LARGE_INTEGER start;
	LARGE_INTEGER end;
	LARGE_INTEGER freq;
	// 使うCPUを固定！
	SetThreadAffinityMask(GetCurrentThread(), 1);
	QueryPerformanceFrequency(&amp;amp;freq);
	QueryPerformanceCounter(&amp;amp;start);
	// 何かの処理
	QueryPerformanceCounter(&amp;amp;end);

	double time = ((double) end.QuadPart - (double) start.QuadPart) / (double) freq.QuadPart;
	std::cout &amp;lt;&amp;lt; "処理時間: " &amp;lt;&amp;lt; time &amp;lt;&amp;lt; "sec" &amp;lt;&amp;lt; std::endl;
	return 0;
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;# 駄文：会社より家のほうが開発環境いいわぁ～。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/144545.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++]処理時間を測りたいのです</title><link>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144423.aspx</link><pubDate>Thu, 19 Jun 2008 13:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144423.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/144423.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144423.aspx#Feedback</comments><slash:comments>527</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/144423.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/144423.aspx</trackback:ping><description>&lt;P&gt;処理時間を測りたい。&lt;BR&gt;精度も良ければ良いに越したことは無い。&lt;/P&gt;
&lt;P&gt;ということで、そういう時に使えるものでQueryPerformanceFrequencyとQueryPerformanceCounterっていうAPIがある。&lt;BR&gt;QueryPerformanceCounterで取得できるのは「高分解能パフォーマンスカウンタ」の値らしい。&lt;BR&gt;このカウンタは、OSが起動してからせっせとカウントアップをしているみたい。&lt;BR&gt;んで、QueryPerformanceFrequencyは、1秒あたりに、このカウンタがいくつカウントアップするかを教えてくれる。&lt;BR&gt;なので、開始と終了でCounterの値をとって、差を出してFrequencyで割ればかかった時間を秒数で取得できるっていう寸法。&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;#include &lt;IOSTREAM&gt;&lt;BR&gt;#include &lt;WINDOWS.H&gt;&lt;BR&gt;#include &lt;TCHAR.H&gt;&lt;/P&gt;
&lt;P&gt;int main(int argc, TCHAR **argv)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;// wchar_tを表示するため．．．&lt;BR&gt;&amp;nbsp;std::locale::global(std::locale("japanese"));&lt;/P&gt;
&lt;P&gt;&amp;nbsp;LARGE_INTEGER start;&lt;BR&gt;&amp;nbsp;LARGE_INTEGER end;&lt;BR&gt;&amp;nbsp;LARGE_INTEGER freq;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;QueryPerformanceCounter(&amp;amp;start);&lt;BR&gt;&amp;nbsp;// 計測したい処理&lt;BR&gt;&amp;nbsp;Sleep(1000);&lt;BR&gt;&amp;nbsp;QueryPerformanceCounter(&amp;amp;end);&lt;BR&gt;&amp;nbsp;QueryPerformanceFrequency(&amp;amp;freq);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;// こんな感じで計算する&lt;BR&gt;&amp;nbsp;double time = ((double) end.QuadPart - (double) start.QuadPart) / (double) freq.QuadPart;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;std::wcout &amp;lt;&amp;lt; _T("かかった時間 = ") &amp;lt;&amp;lt; time &amp;lt;&amp;lt; _T("sec") &amp;lt;&amp;lt; std::endl;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/144423.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++]ODBCでDBに繋いでみたよ</title><link>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144418.aspx</link><pubDate>Thu, 19 Jun 2008 12:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144418.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/144418.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/06/19/144418.aspx#Feedback</comments><slash:comments>594</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/144418.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/144418.aspx</trackback:ping><description>&lt;P&gt;まさか、C++で生のODBC使ってDBに繋ぐことをする日がくるとは思ってなかった。&lt;BR&gt;とりあえずメモ。&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR&gt;#include &amp;lt;tchar.h&amp;gt;&lt;/P&gt;
&lt;P&gt;// ODBC&lt;BR&gt;#include &amp;lt;windows.h&amp;gt;&lt;BR&gt;#include &amp;lt;sql.h&amp;gt;&lt;BR&gt;#include &amp;lt;sqlext.h&amp;gt;&lt;BR&gt;#pragma comment (lib, "odbc32.lib")&lt;/P&gt;
&lt;P&gt;int main(int argc, char **argv)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;HENV henv;&lt;BR&gt;&amp;nbsp;HDBC hdbc;&lt;BR&gt;&amp;nbsp;HSTMT hstmt;&lt;BR&gt;&amp;nbsp;RETCODE rc;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;SQLAllocEnv(&amp;amp;henv);&lt;BR&gt;&amp;nbsp;SQLAllocConnect(henv, &amp;amp;hdbc);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;rc = SQLConnect(&lt;BR&gt;&amp;nbsp;&amp;nbsp;hdbc,&lt;BR&gt;&amp;nbsp;&amp;nbsp;_T("ODBCデータソースで指定した名前"), SQL_NTS, _T("ユーザ名"), SQL_NTS, _T("パスワード"), SQL_NTS);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;if (rc != SQL_SUCCESS &amp;amp;&amp;amp; rc != SQL_SUCCESS_WITH_INFO)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; // 接続できなかったので後処理をしてね&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;SQLAllocStmt(hdbc, &amp;amp;hstmt);&lt;BR&gt;&amp;nbsp;if (SQLExecDirect(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hstmt, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;_T("select column1, .....SQL文！"), &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;SQL_NTS) == SQL_SUCCESS)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;long column1 = 0L; // カラムの値を入れるための変数 カラム数ぶん準備してね&lt;BR&gt;&amp;nbsp;&amp;nbsp;SQLINTEGER pcbValue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;SQLBindCol(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hstmt, 1, SQL_C_LONG, &amp;amp;empno, sizeof(column1), &amp;amp;pcbValue); // 変数とカラムを対応付け&amp;nbsp;第二引数がカラムのインデックス(1はじまり) 第三引数で型を指定&lt;BR&gt;&amp;nbsp;&amp;nbsp;while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// データ取れたのでお好きにどうぞ&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;// 後処理&lt;BR&gt;&amp;nbsp;SQLFreeStmt(hstmt, SQL_DROP);&lt;BR&gt;&amp;nbsp;SQLDisconnect(hdbc);&lt;BR&gt;&amp;nbsp;SQLFreeConnect(hdbc);&lt;BR&gt;&amp;nbsp;SQLFreeEnv(henv);&lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;こんなもんかな．．．。&lt;BR&gt;正直メンドクサイのでクラス化してしまいたい衝動にかられる。&lt;BR&gt;既にC++から気楽に使えるものがあったりするのだろうか。&lt;/P&gt;
&lt;P dir=ltr&gt;DBに繋ぐプログラムは、.NETになってからしかやったことないので疎いわぁ。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/144418.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++]privateなメソッドを呼び出させてもらうぞ～</title><link>http://blogs.wankuma.com/kazuki/archive/2008/03/14/127731.aspx</link><pubDate>Fri, 14 Mar 2008 18:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/03/14/127731.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/127731.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/03/14/127731.aspx#Feedback</comments><slash:comments>290</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/127731.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/127731.aspx</trackback:ping><description>&lt;P&gt;C++だけ微妙に弱気なタイトルですが&amp;#8230;&lt;BR&gt;RubyやJavaやC#だと外部から色々頑張ればどうにかなったけど、C++ではどうにもならない。&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;#include &amp;lt;iostream&amp;gt;&lt;/P&gt;
&lt;P&gt;class A&lt;BR&gt;{&lt;BR&gt;private:&lt;BR&gt;&amp;nbsp;void Foo() { std::cout &amp;lt;&amp;lt; "A#Foo" &amp;lt;&amp;lt; std::endl; }&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;class B&lt;BR&gt;{&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;void Bar()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;A a;&lt;BR&gt;&amp;nbsp;&amp;nbsp;a.Foo(); // どうあがいてもコンパイルエラー&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;int main()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;B b;&lt;BR&gt;&amp;nbsp;b.Bar();&lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;こういう場合は、C++では明示的にAクラスからBクラスに対してprivateメンバへのアクセスを許可する方法が提供されてるのでそれを使います。&lt;/P&gt;
&lt;P dir=ltr&gt;書き方は、「friend class クラス名;」というわけでやってみよう。&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr&gt;#include &amp;lt;iostream&amp;gt;&lt;/P&gt;
&lt;P dir=ltr&gt;class B; // AでBを見るために前方宣言&lt;BR&gt;class A&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;friend class B; // Bさんには私の全てを見せます&lt;BR&gt;private:&lt;BR&gt;&amp;nbsp;void Foo() { std::cout &amp;lt;&amp;lt; "A#Foo" &amp;lt;&amp;lt; std::endl; }&lt;BR&gt;};&lt;/P&gt;
&lt;P dir=ltr&gt;class B&lt;BR&gt;{&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;void Bar()&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;A a;&lt;BR&gt;&amp;nbsp;&amp;nbsp;a.Foo(); // お友達なのでprivateな所も呼べる&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/P&gt;
&lt;P dir=ltr&gt;int main()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;B b;&lt;BR&gt;&amp;nbsp;b.Bar();&lt;BR&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;実行すると、A#Fooと表示される。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/127731.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++]問題で～す！に答えてみる</title><link>http://blogs.wankuma.com/kazuki/archive/2008/03/04/126072.aspx</link><pubDate>Tue, 04 Mar 2008 00:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/03/04/126072.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/126072.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/03/04/126072.aspx#Feedback</comments><slash:comments>1422</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/126072.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/126072.aspx</trackback:ping><description>&lt;P&gt;元の記事：&lt;A title=http://blogs.wankuma.com/myugaru/archive/2008/03/03/126036.aspx HREF="/myugaru/archive/2008/03/03/126036.aspx"&gt;http://blogs.wankuma.com/myugaru/archive/2008/03/03/126036.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;元の記事から引用&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;問題：似たような入れ子になっているクラスがいくつかあって困っている。親同士、子同士はそれぞれ基底クラスを定義してまとめられそうだ。しかし親クラスは子クラスに依存しているところ(List部分)がある。どうまとめればカッコよいか？ 
&lt;P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b807429b-31bf-45f0-9ada-60b03e774365 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE class=c# name="code"&gt;class ParentA
{
    List&lt;CHILDA&gt; children;
    
    public void cooking()
    {
    }
    
    public class ChildA
    {
        public void study()
        {
        }
    }
}
    
class ParentB
{
    List&lt;CHILDB&gt; children;
    
    public void cooking()
    {
    }
    
    public class ChildB
    {
        public void study()
        {
        }
    }
}
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;とりあえず感覚的にtemplateの出番かな。C++/CLIさん出番です。&lt;/P&gt;
&lt;P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c31936c5-64b9-4c27-b4aa-b9b0b8e44453 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE class=c name="code"&gt;// Question.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

using namespace System;
using namespace System::Collections::Generic;

// 親の抽象クラス
template&lt;CLASS TChild&gt;
ref class Parent abstract
{
public:
	// 子クラスの型
	typedef TChild ChildType;
public protected:
	// 子クラスのリスト
	property List&lt;CHILDTYPE^&gt; ^Children;
public:
	// childrenのインスタンスを一応作っとく
	Parent()
	{
		Children = gcnew List&lt;CHILDTYPE^&gt;();
	}
	// 一応仮想デストラクタ C++/CLIではいるんだっけかな？
	virtual ~Parent() {}

	// 後で、オーバーライドしてくれ！
	virtual void Cooking() abstract;
};

// 親の実装例A
template&lt;CLASS TChild&gt;
ref class ParentA : public Parent&lt;TCHILD&gt;
{
public:
	virtual void Cooking() override
	{
		Console::WriteLine("ParentA::Cooking");
	}
};

// 親の実装例B
template&lt;CLASS TChild&gt;
ref class ParentB : public Parent&lt;TCHILD&gt;
{
public:
	virtual void Cooking() override
	{
		Console::WriteLine("ParentB::Cooking");
	}
};

// 子の抽象クラス
ref class Child abstract
{
public:
	// 後で、オーバーライドしてくれ！
	virtual void Study() abstract;
};

// 子の実装A
ref class ChildA : public Child
{
public:
	virtual void Study() override
	{
		Console::WriteLine("ChildA::Study");
	}
};

// 子の実装B
ref class ChildB : public Child
{
public:
	virtual void Study() override
	{
		Console::WriteLine("ChildB::Study");
	}
};

// お試し関数
template&lt;CLASS TChild&gt;
void Print(Parent&lt;TCHILD&gt; ^parent)
{
	typedef Parent&lt;TCHILD&gt; ParentType;
	typedef ParentType::ChildType ChildType;
	Console::WriteLine("★" + ParentType::typeid-&amp;gt;Name);
	// 受け取った方の子を３人作って追加
	parent-&amp;gt;Children-&amp;gt;Add(gcnew ChildType());
	parent-&amp;gt;Children-&amp;gt;Add(gcnew ChildType());
	parent-&amp;gt;Children-&amp;gt;Add(gcnew ChildType());

	// 親のCookingスタート
	parent-&amp;gt;Cooking();
	// 子供の勉強スタート
	for each (ChildType ^child in parent-&amp;gt;Children)
	{
		child-&amp;gt;Study();
	}
	Console::WriteLine();
}

int main(array&lt;?XML:NAMESPACE PREFIX = System /&gt;&lt;System::String ^&gt; ^args)
{
	// 親２x子２の組み合わせのtypedef
	typedef ParentA&lt;CHILDA&gt; ParentAChildA;
	typedef ParentA&lt;CHILDB&gt; ParentAChildB;
	typedef ParentB&lt;CHILDA&gt; ParentBChildA;
	typedef ParentB&lt;CHILDB&gt; ParentBChildB;

	// 4パターンお試し
	Print(%ParentAChildA());
	Print(%ParentAChildB());
	Print(%ParentBChildA());
	Print(%ParentBChildB());

    return 0;
}
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;C++って強力だと感じるひと時。でも、こういうのに浸ってるときって実はやりすぎてることが多い。&lt;BR&gt;はてさて今回はどうだろう&amp;#8230;。&lt;/P&gt;&lt;/System::String&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/126072.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++][C#]\\ホスト名 or IPで繋ぐときのログインをPGからやるよ</title><link>http://blogs.wankuma.com/kazuki/archive/2008/02/27/125066.aspx</link><pubDate>Wed, 27 Feb 2008 00:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/02/27/125066.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/125066.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/02/27/125066.aspx#Feedback</comments><slash:comments>579</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/125066.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/125066.aspx</trackback:ping><description>&lt;P&gt;Windowsで別マシンにアクセスするときに「&lt;A href="file://\\IP"&gt;\\IPアドレス」&lt;/A&gt;みたいな感じのをエクスプローラやファイル名を指定して実行から打ち込む。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://kazuki.wankuma.com/images/2008/CCorIPPG_99B/image.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=147 alt=image src="http://kazuki.wankuma.com/images/2008/CCorIPPG_99B/image_thumb.png" width=244 border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;このときに、ログイン画面が出て適切なユーザ名とパスワードを打ち込んで晴れてアクセス出来るようになる。&lt;BR&gt;こうなると&lt;A href="http://itpro.nikkeibp.co.jp/word/page/10005754/"&gt;管理共有&lt;/A&gt;とかでCドライブとかDドライブとか見れてウハウハなことになっちゃう。&lt;/P&gt;
&lt;P&gt;最低でも、インターネットに公開するサーバではオフにするかFWあたりでがっちり固めようね！&lt;BR&gt;でもまぁ便利だから使っちゃうし、ちょっとした管理ツールをこさえようとしたらあったほうが楽チンだ。&lt;/P&gt;
&lt;P&gt;こういうツール作ろうとすると、プログラム側からログインしたいとか思っちゃう。&lt;BR&gt;今までは、事前にエクスプローラとかからログインしておいて実行するとかしてたけど、それもめんどくさくなった。&lt;/P&gt;
&lt;P&gt;こういう時に使えるAPIが、WNetAddConnection2/WNetAddConnection3っていうのがある！&lt;BR&gt;どうやらこいつは構造体とかを受け取って仕事をするらしい&amp;#8230;&lt;BR&gt;プラットフォーム呼び出しは、構造体があるとめんどくさいという記憶しかないのでスルー。&lt;/P&gt;
&lt;P&gt;C++/CLIを使ってラップしてみた。&lt;/P&gt;
&lt;P&gt;まず、クラスライブラリでプロジェクトを作ってstdafx.hに下の内容を追加。&lt;/P&gt;
&lt;P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:dad6c985-430e-4570-a1d9-11a0e15c2b10 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE class=c name="code"&gt;#pragma once

#pragma comment(lib, "Mpr.lib")

#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;Vcclr.h&amp;gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR&gt;#pragma comment(lib, "hogehoge.lib")をすっかり忘れてたのは秘密。&lt;BR&gt;続いて、適当なクラスをでっちあげる。&lt;BR&gt;今回はログインさえ出来ればいいので、使用イメージとしては 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8343583a-3b5b-4d60-8870-a5bed72f4298 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE class=c# name="code"&gt;if (NativeWrap.Win32.NetAddConnect("\\あいぴぃ", "ゆーざめい", "ぱすわぁど")) {
  // ログイン成功
} else {
  // ログインだめだったよ～
}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;くらいのノリでC#から使えるようにしよう。ということでクラス作成。ヘッダに下のような感じでクラスとメソッドを定義！&lt;/P&gt;
&lt;P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5bab4da1-a9f2-4f53-a54f-9dccd9994817 style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE class=c name="code"&gt;#pragma once

using namespace System;

namespace NativeWrap {

 public ref class Win32
 {
 public:
  static bool NetAddConnect(
   String^ host, String^ user, String^ pass);
 };
}
&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;cppのほうにメソッドの中身を書く。中身は、API呼んでるだけなのでシンプル。&lt;BR&gt;ポイントをしいて言えばSystem::String^からwchar_t*に変えてるところくらいかな？&lt;/P&gt;
&lt;P&gt;
&lt;DIV class=wlWriterSmartContent id=scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6f51ce35-21d2-4ace-91ba-5533d78772aa style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;&lt;PRE class=c name="code"&gt;// これは メイン DLL ファイルです。

#include "stdafx.h"

#include "NativeWrap.h"

bool NativeWrap::Win32::NetAddConnect(System::String ^host, 
           System::String ^user, 
           System::String ^pass)
{
 typedef pin_ptr&lt;CONST wchar_t&gt; char_ptr;
 const char_ptr hostPtr = PtrToStringChars(host);
 const char_ptr userPtr = PtrToStringChars(user);
 const char_ptr passPtr = PtrToStringChars(pass);

 NETRESOURCE res = {0};
 res.dwType = RESOURCETYPE_DISK;
 res.lpRemoteName = (LPWSTR)hostPtr;
 DWORD ret = WNetAddConnection2(
  &amp;amp;res,
  passPtr,
  userPtr,
  0);
 return ret == NO_ERROR;
}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;因みに、動作確認できてません！家にマシン一台しかありませんから。&lt;BR&gt;でも、大体こんな感じ。&lt;/P&gt;
&lt;P&gt;使い方は、上で最初のほうに示したとおりです。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/125066.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C++][STL]久しぶりに触ってみたけど素敵だ</title><link>http://blogs.wankuma.com/kazuki/archive/2008/02/26/124899.aspx</link><pubDate>Tue, 26 Feb 2008 00:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/02/26/124899.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/124899.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/02/26/124899.aspx#Feedback</comments><slash:comments>109</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/124899.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/124899.aspx</trackback:ping><description>&lt;p&gt;C++に長久しぶりに触ってみた。&lt;br&gt;C++は標準ライブラリが貧相なので、最近小物を作ったりするのにつかってなかったけど復帰してみようかなぁ。&lt;/p&gt; &lt;p&gt;昔は暗記してたSTLも、ほとんど忘却の彼方。&lt;br&gt;ということで、ちょびっとだけ復習をしてみよう。&lt;/p&gt; &lt;p&gt;第一弾！！&lt;br&gt;コンテナの部からstd::vector&amp;lt;T&amp;gt;&lt;br&gt;アルゴリズムの部からstd::sort&lt;br&gt;イテレータの部からstd::istream_iterator&amp;lt;T&amp;gt;, std::ostream_iterator&amp;lt;T&amp;gt;&lt;/p&gt; &lt;p&gt;ついでに、C++/CLIのプロジェクト内でさくっと使えるのか試してみる。（問題は無いんだろうけど）&lt;/p&gt; &lt;p&gt;コンソールのプロジェクトをさくっと作成。&lt;br&gt;stdafx.hに下のincludeを追加する。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bc1d5e5e-0532-4f0c-8416-715917197fa0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;iterator&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そういえば、何を作るか言ってなかった。&lt;br&gt;キーボードからCtrl + Zが入力されるまで、数値を読み込んでいく。んで、ソートして出力！&lt;br&gt;超簡単プログラム。思い出すにはちょうどいい！&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:64fdba14-ea2f-4249-98fd-4083c484bcae" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;#include "stdafx.h"

using namespace System;

int main(array&amp;lt;System::String ^&amp;gt; ^args)
{
	std::vector&amp;lt;int&amp;gt; v;
	std::copy(std::istream_iterator&amp;lt;int, wchar_t&amp;gt;(std::wcin), 
		std::istream_iterator&amp;lt;int, wchar_t&amp;gt;(),
		std::back_insert_iterator&amp;lt;std::vector&amp;lt;int&amp;gt; &amp;gt;(v));
	std::sort(v.begin(), v.end());
	std::copy(v.begin(), v.end(), std::ostream_iterator&amp;lt;int, wchar_t&amp;gt;(std::wcout, L" "));
    return 0;
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;可も無く不可も無くといった感じ。&lt;br&gt;std::back_insert_iteratorとかよく覚えてたな自分。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/124899.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>