トップ回答者
formを引数で渡したい

質問
-
いつもお世話になっております
VS2008 でC++/CLIを使ってフォームアプリを作成していますdelegateを使用して、Formを引数で渡したいと思っています。
下記の様にコードを書きました
delegate IplImage* TestDelegate(TestProject::MainForm^ fm);
このとき、下記のようなビルドエラーが発生します。
エラー 1 error C2039: 'MainForm' : TestProject のメンバではありません。
MainFormのコードは下記の様になっており、MinFormTestProjectの下にあるのですが、なぜこのようなエラーが出てしまうのでしょうか??
namespace TestProject { using namespace System; using namespace System::Text; using namespace System::IO; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Diagnostics; /// <summary> /// MainForm の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class MainForm : public System::Windows::Forms::Form { public: MainForm(void) { InitializeComponent();
- 編集済み BB-X LARISSA 2012年11月10日 16:52
回答
-
最初の質問は単にエラーになりましたお手上げです、としか読み取れない質問したが、「相互includeを解決したい」ならずいぶんと違います。
delegateの宣言はよく見るとMainFormのトラッキング参照しているだけで、MainForm内のメンバー変数についてはなにも触れられていません。となれば、MainFormクラスの定義を得るためにMainForm.hをincludeせずともMainFormクラスを宣言するだけで済みます。TestDelegate.hは具体的には
namespace TestProject{ ref class MainForm; delegate IplImage* TestDelegate(MainForm^ fm); }
とできます。
- 回答としてマーク BB-X LARISSA 2012年11月26日 0:20
すべての返信
-
Azuleanさん
回答ありがとうございます。
TestDelegateは、TestDelegate.hに書かれており、ファイルの先頭でMainForm.hをincludeしています。
しかしMainForm.h側も当然Delegateを呼びたいのでTestDelegate.hを参照したいのでincludeしています。
これでは相互includeになってしまいますが・・・
もしも、MainFormの先頭行でTestDelegate.hをincludeするので、まだMainForm()の宣言がされていないということでリンクエラーが出るのであれば、Formを引数で渡すってことが出来ないってことでしょうか?
-
最初の質問は単にエラーになりましたお手上げです、としか読み取れない質問したが、「相互includeを解決したい」ならずいぶんと違います。
delegateの宣言はよく見るとMainFormのトラッキング参照しているだけで、MainForm内のメンバー変数についてはなにも触れられていません。となれば、MainFormクラスの定義を得るためにMainForm.hをincludeせずともMainFormクラスを宣言するだけで済みます。TestDelegate.hは具体的には
namespace TestProject{ ref class MainForm; delegate IplImage* TestDelegate(MainForm^ fm); }
とできます。
- 回答としてマーク BB-X LARISSA 2012年11月26日 0:20
-
これでは相互includeになってしまいますが・・・
もしも、MainFormの先頭行でTestDelegate.hをincludeするので、まだMainForm()の宣言がされていないということでリンクエラーが出るのであれば、Formを引数で渡すってことが出来ないってことでしょうか?
佐祐理さんも書かれていますが、そういったことに気づいていて回避したかったと言うことが最初からわかっていたのであればそれを書いてください。(私からの指摘を受けて、そういう質問にいたったのであれば仕方がないところではあります)
なお、この問題は佐祐理さんがすでに答えを書いておられますが、C++ の世界での経験があれば思い至る範囲です。
C++/CLI を使わないといけない事情があるとのことですが、C++ の理解・経験が浅い中で進めることは茨の道です。
コンパイルが通っても実行時に落ちるとか、他の言語に比べて難易度が非常に高い。また、C++/CLI で Windows Forms を使ったプログラミングは VS2012 からテンプレートが廃止されているなど、おすすめできない情勢でもあります。// C++/CLI でなければならない理由が、C/C++ のライブラリを使うためだけだったら、ラッパー部分だけ C++/CLI にするのが楽ですが、そういったことではないのですよね?
- 編集済み AzuleanMVP, Moderator 2012年11月12日 13:35