• ベストアンサー

C++のクラス内で、ウインドウプロシージャなどの・・・

Visual C++ 2008で、Windowsフォームアプリケーションを作っています。 .NET Frameworkでは実現できないウインドウを作るために、WindowsAPIに頼り始めたのですが これが分からないのでとても不便な状態なのですが WindowsAPIで使うための、ウインドウプロシージャや、ウインドウハンドルや、デバイスコンテキストハンドル・・・等を C++のクラスの中で、staticを付けずに普通のメンバとして組み込む事は、出来るのでしょうか? - - - - - - 今までは分からなかったので、とりあえずAPIに触れてみようと思いstaticをつけてどうにかやっていたのですが、それだとクラス内のインスタンスメンバにアクセスできないので、クラス内に作ってる意味がない感じになってしまいます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 こんにちは。補足頂きました。  WndProc等の事について、説明不足だったかもしれません。 >>仮想関数WndProcと共用体の別ウインドウハンドルをここからどう使っていくかが把握できないので  union  {   HWND hWnd;   HWND hDlg;   HWND hCtl;  };  の事でしょうか。此れに関しては、何れも同じなので、深い意味は無いです・・・。  ネイティブのwin32プログラムでウィンドウハンドルの命名の仕方に、通常のウィンドウやキャプションの無いクライアント領域子ウィンドウにhWnd、ダイアログウィンドウにはhDlg等と名づけ、エディットボックスやコンボボックス等のコントロールのウィンドウハンドルにhCtlと名づけたりする事が良くあるので、共用体にして名前を複数用意しただけの事です。  何れもウィンドウである為、操作に使用するwin32APIはほぼ同一ですが、プロシージャ内のコーディング等に幾分の違いがあります。 >>そして、つまり…いずれにしてもSetProp・GetPropは使って、一段階は変換する必要がある…って事ですよね?  はい。プロシージャはコールバック関数なので、呼び出される度クラスのインスタンス外に放り出される為、「何らかの手段において」このウィンドウを開いた張本人「クラスのポインタ」を探さなければなりません。  よく有るやり方は、ウィンドウハンドルに対し、自由データを設定できるwin32API利用して、クラスのポインタを無理矢理キャストしてhWndとクラスのポインタの関連付けを行い、プロシージャコールバック時に第一パラメータのhWndから、win32APIを使ってつまみ出すと言うやり方です。  ウィンドウハンドルに対して自由データを設定できる関数は、以下のものがありますが、何れもlong型やHANDLE型(素性はvoid*)なので、強引なキャストは避けられなくなります。  「SetProp/GetProp」  http://msdn.microsoft.com/ja-jp/library/cc411066.aspx  http://msdn.microsoft.com/ja-jp/library/cc364724.aspx  「SetWindowLongPtr/GetWindowLongPtr」  http://msdn.microsoft.com/ja-jp/library/cc411204.aspx  http://msdn.microsoft.com/ja-jp/library/cc364762.aspx  例えば、  ::SetWindowLongPtr(hWnd, GWL_USERDATA, (long)this);  CWnd* pWnd = (CWnd*)::GetWindowLongPtr(hWnd, GWL_USERDATA);  の様にして使う。  別の手法としては、hWndをキーにしてCWnd*を値にするハッシュテーブルの様なデータ構造を作成、又は利用すればこの様な強引なキャストを避ける事も可能です。  また、プロシージャのコールバックについては、メッセージの種類に応じて、wParamとlParamを、規定された型へキャストして使用する事になっています。  例えば、WM_NCCREATEの場合は  http://msdn.microsoft.com/en-us/library/ms632635(VS.85).aspx  wParam 未使用  lParam CREATESTRUCT*型へキャスト  http://msdn.microsoft.com/en-us/library/ms632603(VS.85).aspx  CREATESTRUCT型のlpCreateParamsメンバ変数に、CreateWindowExの一番最後のパラメータに渡した数値が入っている  と言う事です。  //クラス内でウィンドウを作成  ::CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("test c++cli win32"), TEXT("hello win32"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, w, h, hWndParent, NULL, m_hInst, this/*クラスのポインタを入れて送り届けている*/);  //プロシージャ内  if(uMsg == WM_NCCREATE)  {   LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);//規定通りキャストする   pWnd = static_cast<CWnd*>(lpcs->lpCreateParams);//ココにクラスのポインタが入っている   ::SetProp(hWnd, TEXT("window ptr"), pWnd);//論点のSetProp()APIを使用して、ウィンドウハンドルに設定している   pWnd->m_hWnd = hWnd;//クラスのメンバにウィンドウハンドルを代入している   lResult = pWnd->WndProc(msg);//クラスの仮想関数WndProcを呼び出してあげる(以後、この仮想関数内に色々実装される)  }  また、WM_NCCREATEはウィンドウの非クライアント領域(キャプションバーなど)が作成された時に呼び出されるメッセージです(ウィンドウが作成されてから2番目に呼ばれる)。

LongSecret
質問者

お礼

こんばんは。ありがとうございます! ああ、質問が止まりません SetProp/GetProp SetWindowLongPtr/GetWindowLongPtr のいずれかで行う場合は、どちらがより優れていますか? -------------- >ハッシュテーブルの様なデータ構造 というのは、これもやはりあらかじめプロシージャとかなにから全部別途用意しておいて、そっちに飛ばす その際、キャストして、か 評価して、か の違いになるという事でしょうか? -------------- なるほど LPCREATESTRUCTの部分も良く分からなかったのですが そっちにthisがあって、そういう仕掛けになっていたのですね。 納得です。 と、ここで >CREATESTRUCT型のlpCreateParamsメンバ変数に、CreateWindowExの一番最後のパラメータに渡した数値が~ このCREATESTRUCTを使って出来るのかな・・?? という疑問は湧いたのですが、ウインドウの表示非表示切り替えを行いたいのですが、可能なのでしょうか?また、可能だとしてもどのように書けばいいのかピンとこないので、実例を教えていただく事は出来ますでしょうか? http://oshiete1.goo.ne.jp/qa4666555.html

その他の回答 (4)

回答No.5

 こんばんは。 >>SetProp/GetProp >>SetWindowLongPtr/GetWindowLongPtr >>のいずれかで行う場合は、どちらがより優れていますか?  SetProp/GetPropの方が良いと思います。 >>これもやはりあらかじめプロシージャとかなにから全部別途用意しておいて、そっちに飛ばす >>その際、キャストして、か >>評価して、か >>の違いになるという事でしょうか?  extern等で唯一のハッシュテーブル等を用意して置き、多数のプロシージャ内で其れを使用し、ウィンドウハンドルをキーに当てて、検索、評価、あれば呼び出し、無ければ登録する、と言った具合でしょう。  WM_NCCREATE内で登録し、WM_NCDESTROY内でウィンドウが無くなる為、登録解除する事になります。  WM_NCCREATEを通過すれば、WM_NCDESTROYが来るまで、その他のメッセージに関しては、必ず検索が成功する筈です。 >>ウインドウの表示非表示切り替えを行いたいのですが、可能なのでしょうか?また、可能だとしてもどのように書けばいいのかピンとこないので、実例を教えていただく事は出来ますでしょうか?  リンク先質問の方で回答します。

LongSecret
質問者

お礼

全く驚くべき丁寧さで解説していただき、本当にありがとうございました!! 感謝の限りも御座いません。 概念的な部分は質問前と比べて色々把握できましたが 細かい実践的で具体的な部分については 今後また疑問が出たら新しく質問を立てさせていただきますので、もしご都合がよろしければその時はまたお願いいたします。 しかし本当にありがとうございました。

回答No.3

 こんばんは。補足頂きました。 >>まずは、typedefなどをしなくても、普通に宣言してるだけで >>「struct 構造体名 構造体変数」 >>でなく >>「構造体名 構造体変数」 >>で出来るのは、C++の機能でしょうか?  はい。  そして、c++に置いては、classとstructは同一です。唯一の違いは、内部に置かれたメンバ「関数(当然コンストラクタ、デストラクタも)・変数」が、  class デフォルトでprivate  struct デフォルトでpublic  と言う事です。  テンプレートに関しては、コンパイルの時点で方が決まるという事です。  クラスの外側に置く方法と、関数のパラメータに置く事が出来ます。  //例えばクラスの外側に置く  struct DATA  {   int i;   char ch;   short sh;  };  template<class T>  struct bogus  {   T* p;  };  bogus<int> ptr1;  bogus<long> ptr2;  bogus<DATA> ptr3;  ptr1.p;//int*  ptr2.p;//long*  ptr3.p;//DATA*  になる。  //例えば関数に置く  template<class _WPARAM, class _LPARAM>  INT CustSendMessage(HWND hWnd, UINT uMsg, _WPARAM wParam, _LPARAM lParam)  {    return ::SendMessage(hWnd, uMsg, (WPARAM)wParam, (LPARAM)lParam);  }  SendMessage()APIは、ウィンドウに操作する度必要ですが、uMsgに指定したフラグに応じて、WPARAMとLPARAMに様々なデータを入れなければいけません。  場合によっては、ポインタを無理矢理キャストして入れることもあります。  例えば、ウィンドウからテキストを取り出したい場合、  ですが、其のまま描くと  TCHAR ch[128];  ::SendMessage(hWnd, WM_GETTEXT, sizeof(ch)/sizeof(TCHAR), (LPARAM)ch);  と言う事に成ります。テンプレートを使えば、  ::CustSendMessage(hWnd, WM_GETTEXT, sizeof(ch)/sizeof(TCHAR)/*unsigned intにコンパイルされる*/, ch/*TCHAR*にコンパイルされる*/);  自動的に型が決定される為、むやみなキャストを減らす事が出来ます。  実は、このテンプレートはとても奥が深くて、こういった技法の事を言及するだけで辞典一冊書ける位です。  C++書籍の中には、テンプレートのみを一点に絞って説明する専門書もあります。  また、Cではマクロでしていた事をC++ではテンプレートでする事も多いです。  STLも、テンプレート技法の一環と言えるかも知れません。興味があれば、此方も調査されて見ると良いでしょう。

LongSecret
質問者

お礼

こんばんはmachongolaさん、またもありがとうございます! 詳細や状況がより明確になりました。 やはりですか。私もそんな予感がしました。 でも、その分これうまく使いこなせたら面白そうですよね…?(♪) templateの使用感含め、徐々にチェックしている感じです。 とりあえず今回は「一つの質問」として、内容的には締めにして十分だと思いますが、把握すべき事が多いですので もう少し確認等に時間をください。 本当にちょっとした付加質問でしたら、また浮上する可能性もありますが、難しそうな質問でしたら再度別途立てますので、その時はまた可能でしたらよろしくお願いします。 (私は、丁寧に答えてくださる方に、ありがとうポイントをたっぷり用意したい気分ですから。(微笑)) そして、全体がすっきり解決しましたら、その時この質問を締めとさせていただきます。 しかし、結構突っ込んだところまで本当にありがとうございます。 じっくりと挑んでみます。

LongSecret
質問者

補足

どうにか大よその構造は分かってきました。 仮想関数WndProcと共用体の別ウインドウハンドルをここからどう使っていくかが把握できないので、うまく説明できないような感覚に襲われていますが 少なくとも「仮想関数」があるとかそもそも「関数がある」とかいう事で、実際問題全くその…構造体・クラスにはpublicかprivate以外差がないのか、周辺情報とともに、以下の質問で確認させてください。 http://oshiete1.goo.ne.jp/qa4664223.html そして、つまり…いずれにしても SetProp・GetProp は使って、一段階は変換する必要がある…って事ですよね?

回答No.2

 こんにちは。  staticのWndProc側でチョッとした処理をした後、メンバ関数版のWndProcに転送します。  WM_NCCREATEでthisポインタを受け取ったら、ウィンドウに関連付けて使い、WM_NCDESTROY辺りでthisポインタを切り離して削除します。  その他、メンバ関数のWndProc内で処理した上、DefWindowProcに「渡す・渡さない」を決めさせたりする必要があるかもしれません。結構大変です。  大分あるアラがあると思いますが、参考程度に。 struct CMessage { template<class _WPARAM, class _LPARAM> CMessage(HWND h, UINT u, _WPARAM wp, _LPARAM lp) : hWnd(h), uMsg(u), wParam((WPARAM)wp), lParam((LPARAM)(lp)), bHandled(FALSE) { } union { HWND hWnd; HWND hDlg; HWND hCtl; }; UINT uMsg; WPARAM wParam; LPARAM lParam; BOOL bHandled;//WndProc内でココにTRUEを入れるとDefWindowProcを呼ばない。 }; struct CWnd { //こっちがコールバック static LRESULT CALLBACK StaticProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CWnd* pWnd = static_cast<CWnd*>(::GetProp(hWnd, TEXT("window ptr"))); CMessage msg(hWnd, uMsg, wParam, lParam); LRESULT lResult = FALSE; //初回登録 if(uMsg == WM_NCCREATE) { LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam); pWnd = static_cast<CWnd*>(lpcs->lpCreateParams); ::SetProp(hWnd, TEXT("window ptr"), pWnd); pWnd->m_hWnd = hWnd; lResult = pWnd->WndProc(msg); } //ウィンドウのポインタがあったら if(pWnd) { switch(uMsg) { case WM_CLOSE: lResult = pWnd->WndProc(msg); if(msg.bHandled)return lResult; ::DestroyWindow(hWnd); return lResult; case WM_NCDESTROY: lResult = pWnd->WndProc(msg); ::RemoveProp(hWnd, TEXT("window ptr")); pWnd->Destruct(); } } return ::DefWindowProc(hWnd, uMsg, wParam, lParam); } explicit CWnd(bool bExit = false) : m_hWnd(NULL), m_hInst(::GetModuleHandle(NULL)), m_bExit(bExit){ } ~CWnd(){ if(m_bExit)::PostQuitMessage(0); } ATOM Regist() { WNDCLASSEX wc = {sizeof(wc)}; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = &CWnd::StaticProc; wc.hInstance = m_hInst; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); wc.lpszClassName = TEXT("test c++cli win32"); return ::RegisterClassEx(&wc); } HWND Create(int x, int y, int w, int h, HWND hWndParent) { return ::CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("test c++cli win32"), TEXT("hello win32"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, w, h, hWndParent, NULL, m_hInst, this); } HWND Create(int x, int y, int w, int h, System::Windows::Forms::Form^ form) { return this->Create(x, y, w, h, static_cast<HWND>(form->Handle.ToPointer())); } void Destruct(){ delete this; } protected: //こっちに転送する virtual LRESULT WndProc(CMessage& msg){ return FALSE; } HWND m_hWnd; HINSTANCE m_hInst; bool m_bExit;//ココがtrueの場合、閉じたら全てを終了させる }; //こんな感じで呼び出す public:Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // CWnd* pWnd = new CWnd(); pWnd->Regist(); pWnd->Create(0, 0, this->Width, this->Height, this); }

LongSecret
質問者

お礼

こんにちは。 具体的なコードをありがとうございます。 今頑張って読み解いている最中なのですが 私はプログラミングに触れ初めて実質的には4か月くらいで、CやC++/CLIはそこそこいじっていたのですが、ネイティブのC++は 丁度、あまりやっていませんでした。 でも色々な事が起きてて、この際全部理解し尽くしたいですので いくらか適宜質問させてください。 マネージ内だとstructが使いづらいか、エラーが出て作り方が良く分からなかったので、今までは全部クラスでやってて、構造体は使った事がなかったのですが (先ほどネイティブクラス内でstructを色々とチェックしてみました) まずは、typedefなどをしなくても、普通に宣言してるだけで 「struct 構造体名 構造体変数」 でなく 「構造体名 構造体変数」 で出来るのは、C++の機能でしょうか? あと、templeteについては込み入った内容になるかもしれない・・?と感じたので、別質問を立てさせていただきました。 http://oshiete1.goo.ne.jp/qa4662948.html もしよろしければ、ご教授のほどよろしくお願いします。

回答No.1

SetPropあたりを使って、ウィンドウハンドルにクラスのポインタを設定してみてはどうでしょうか? 検索ワード:WndProc SetProp

LongSecret
質問者

お礼

ありがとうございます。 調べて考えてみて、それで動作確認は出来たっぽい感じなのですが 調べてみたら色々不安になるような事を見たので これであっていて、問題はないか 問題がない場合でも、より良い方法があったら教えてください。 WNDCLASSEX a; に対し a.lpszClassName = "任意"; a.lpfnWndProc = Proc; とし HWND b=CreateWindowExA(~, a.lpszClassName ~~~~~); に対し ::SetProp(b, "なにか", (HANDLE)this); とし 例えばこれが 「Draw関数を持つ、Treeクラス」内でやるなら プロシージャはスタティックにするよりないのでそうしておいて その中で LRESULT CALLBACK Tree::Proc(HWND hw, UINT uaMsg, WPARAM wp, LPARAM lp){ Tree* tWnd = (Tree*)GetProp(hw, "なにか"); …… とすれば このプロシージャ内で tWnd->Draw(); 等を行える、という事で正しいでしょうか?

関連するQ&A

  • .net frameworkで作られたフォームのウィンドウハンドルとインスタンスハンドルの取得方法

    このたびC++で.net frameworkを使い、アプリケーションを製作しているのですが、フォームのウィンドウハンドルと、アプリケーションのインスタンスハンドルの取得方法が分からなくて困っています。取得する方法はあるのでしょうか? 回答をお待ちしています。どなたかおねがいしますm(_ _)m

  • ネストトップクラス・メンバクラスについて

    現在、SJC-P取得に向け独学でJavaの勉強中です。 ネストクラス・インナークラスについて勉強している最中なのですが、 数冊テキストを読み込んでも、web検索をしても、イマイチよくわからない・・・というのが正直なところです。 どのクラス(アウタークラス/staticインナークラス/非staticインナークラス)の、 どういうメンバ(static/非static/private/final)が、 どのクラスのどういうメンバにアクセス出来るのかが整理しきれません・・・。 わからないなりに、まとめてみたのですが、理解が不十分で、かつ、この下記の通りの理解で正しいのかどうかもわかりません。 (言葉でうまく表現も出来ていない箇所も・・) また理解すべきポイントに不足があるかと思います。 どこが正しく理解出来ているのか・どこがどう間違っているかの指摘及びその内容・理解不足の箇所・よりわかりやすい例の追加や補記など、どうかよろしくお願い致します。 ●staticなインナークラス(=ネストトップクラス)について ・アウタークラスのインスタンスなしに、staticなインナークラスのインスタンスの生成が出来る。 ・staticなインナークラスからはアウタークラスの非staticメンバを直接アクセス出来ない。 (→ただし、staticアウターメンバになら直接アクセス出来る?staticであればprivateでもアクセス可?) ・staticなメソッド内で非staticなインナークラスのオブジェクトが生成出来ない。 ●非staticなインナークラス(=メンバクラス)について ・非staticなインナークラス内にstaticなメンバを持つことは出来ない。 ・アウタークラスのインスタンスを生成してからでないと非staticなインナークラスのインスタンスは生成出来ない。 ・アウタークラスの非staticメンバ及びstaticメンバに直接アクセス出来る。 ●アウタークラス(=外部クラス)について ・アウタークラスのstaticメソッド内で非staticなインナークラスのインスタンスは生成出来ない。 ・非staticインナークラスのメンバ及び、staticなインナークラスのメンバにアクセス出来る。 --------------------------------------------------------- (例)処理はさておき、定義はこんな感じを思い描いております・・ class Outclass{   private int aa;   private static int bb;   private outMethod1();   private static outMethod2();   class NotStaticInner{     private int cc;     //private static int dd;//不可     private inNotStaicMethod1();     //private static inNotStaticMethod2();//不可   }   class StaticInner{     private int ee;     private static int ff;     private inStaticMethod1();     private static inStaticMethod2();   } } 参考テキスト: 『Sun Certified Programmer for Java2 Platform5.0 Exam【310-055】』のChapter11:「ネストクラス・インナークラス」 参考URL: http://wisdom.sakura.ne.jp/programming/java/java46.html

  • 色々なウインドウについて

    VC++2008でWindowsフォームアプリケーションを作っています。 .NET Frameworkのクラスライブラリだけでは出来ないと思うのですが 画像の真ん中のタイトルバーは普通ですよね? その下の、一回り小さいタイトルバーを持つウインドウや 右上はPhotoshopのもので左上はXGworks STというソフトのものなのですが こういった様々なウインドウは、全てWindowsAPIを使えば出来るのでしょうか?

  • クラスでスレッド作成

    VC++2008Express WIN32APIでRS232Cの通信用クラスを作成しています。 RS232Cの受信用スレッドを作成して 1ポートの受信処理をするようにはできます。 ですが ポート追加するたびにクラスをインスタンス化して受信用スレッドを 作成したいのですが、スレッド作成するには使用する変数などを staticにしないといけないため、クラスを複数インスタンス化できません。 どのような手法でクラスから複数スレッドを作成することができるのでしょうか? 分かりにくい説明ですが、参考になるものなどありましたら、 よろしくお願いします。

  • ネストクラス

    ある参考書の説明です。 「ネストクラスとは別のクラスのメンバのことです。  Staticメンバのことをネストといいます。  別クラスのインスタンスのメンバであるネストクラスを通常インナークラスと呼びます。  これは広い意味でネストクラスのことです。」 よく意味がわかりません・・・ もっとわかりやすく教えてください。 また、ネストクラスの解説が載っているページでもいいです。 お願いします

    • ベストアンサー
    • Java
  • コールバック関数のメンバ関数化

    コールバック関数のメンバ関数化について質問です。 WindowsAPIでウィンドウプロシージャ(コールバック関数)をクラスのメンバ関数に しようと思っているのですが、出来るのでしょうか? たとえば、 http://wisdom.sakura.ne.jp/system/winapi/win32/win10.html このサイトにある LRESULT CALLBACK WndProc(HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam); をクラスのメンバ関数にしたいです。 開発環境 XP C,C++ Visual Studio 2005

  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • C++のクラス設計について

    Webや書籍をあたってみたのですが、なかなか解決しないので こちらで相談させいただこうと思い立ちました。 C++で書かれたプログラムを解析しているのですが、 ドキュメントは外部仕様書のみであとはソースコードだけ、という状態です。 コメントもほとんど書かれていないコードについて、リバースエンジニアリングを する必要があり、手始めにクラス図を作成してみました。 すると、複数のクラスでメンバ変数が重複しているのです。 クラスAに、クラスB・C・Dの変数の一部が宣言されていて、 クラスAとクラスBの間で重複している変数はすべてどちらのクラスもprotectedのstatic、 クラスAとクラスC・Dの間で重複している変数はクラスAではprotectedのstatic、 C・Dではprivateです。 クラスBとC・Dは継承関係にありますが、メンバ変数の重複はありません。 クラスAと他クラスは継承関係がなく、メンバ変数が多数重複しています。 クラスAの変数は20個ほどありますが、9割以上がB・C・Dで宣言されている変数と 重複している状態で、かつstaticのprotectedです。 Cはわかるのですが、C++はほとんど書いたことがありません。 アンチパターンなどもあたってみたのですが、上記のような設計についての記述は 見つけられませんでした。こういったクラス間での変数重複は「あり」なのでしょうか? これで情報が足りているかわかりませんが、何卒よろしくお願い致します。

  • クラスの実体を一つにする方法

    現在、以下の構成でアプリケーションを開発しています。 フォーム(C#)⇔ラップDLL(C++/CLI)⇔処理(C++ネイティブのDLL多数) C++DLLのひとつにクラスAがあるとします。 このクラスAを含むDLLは他のDLLにリンクされています。 このクラスAの実体がアプリケーションの中で一つしかないようにするにはどのようにコーディングすれば良いのでしょうか? シングルトンパターンについて書かれたHPを参考につくってみたのですが、アプリケーションを実行するといくつも実体が作られています。 class __declspec(dllexport) DataStore { private: DataStore(): // コンストラクタ {}; ~DataStore() {}; // デストラクタ public: // このインスタンスを使用してメンバにアクセスする。 static DataStore& GetInstance() { static DataStore myInstance; return myInstance; } };

  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。

専門家に質問してみよう