none
formを引数で渡したい RRS feed

  • 質問

  • いつもお世話になっております
    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();



    2012年11月10日 16:51

回答

  • 最初の質問は単にエラーになりましたお手上げです、としか読み取れない質問したが、「相互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
    2012年11月12日 12:08

すべての返信

  • C++/CLI のプロジェクトでは、同じプロジェクトの内のクラス・構造体を使う際は、一般の C++ と同じようにヘッダーファイルをインクルードしておかないと型の参照ができなかったと思います。
    その TestDelegate がコンパイラが処理する段階で、その cpp ファイル上で MainForm の宣言が取り込まれるようにヘッダーファイルをインクルードしてあるかを確認してください。

    2012年11月10日 22:50
    モデレータ
  • 以前も指摘しましたが、宣言・定義・リンク 辺りの知識が足りていません。

    最近の言語と違い、C言語・C++言語・C++/CLI言語ではコンパイルとリンクを明確に分けています。これらの言語を使いたいのなら、コンパイル時に必要な情報は何か、リンク時に必要な情報は何か、きちんと理解すべきです。それができないのなら、コンパイルとリンクを同時に行うC#言語など、別の言語を利用すべきです。

    2012年11月11日 23:26
  • Azuleanさん

    回答ありがとうございます。

    TestDelegateは、TestDelegate.hに書かれており、ファイルの先頭でMainForm.hをincludeしています。

    しかしMainForm.h側も当然Delegateを呼びたいのでTestDelegate.hを参照したいのでincludeしています。

    これでは相互includeになってしまいますが・・・

    もしも、MainFormの先頭行でTestDelegate.hをincludeするので、まだMainForm()の宣言がされていないということでリンクエラーが出るのであれば、Formを引数で渡すってことが出来ないってことでしょうか?

    2012年11月12日 11:21
  • 佐祐理さん

    回答ありがとうございます。

    私の知識不足により、このような質問を投稿してしまい申し訳ありません。

    どうしてもC++/CLI言語を使う必要性がある為、もっと理解を深めます。

    2012年11月12日 11:25
  • 最初の質問は単にエラーになりましたお手上げです、としか読み取れない質問したが、「相互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
    2012年11月12日 12:08
  • これでは相互includeになってしまいますが・・・

    もしも、MainFormの先頭行でTestDelegate.hをincludeするので、まだMainForm()の宣言がされていないということでリンクエラーが出るのであれば、Formを引数で渡すってことが出来ないってことでしょうか?

    佐祐理さんも書かれていますが、そういったことに気づいていて回避したかったと言うことが最初からわかっていたのであればそれを書いてください。(私からの指摘を受けて、そういう質問にいたったのであれば仕方がないところではあります)

    なお、この問題は佐祐理さんがすでに答えを書いておられますが、C++ の世界での経験があれば思い至る範囲です。
    C++/CLI を使わないといけない事情があるとのことですが、C++ の理解・経験が浅い中で進めることは茨の道です。
    コンパイルが通っても実行時に落ちるとか、他の言語に比べて難易度が非常に高い。また、C++/CLI で Windows Forms を使ったプログラミングは VS2012 からテンプレートが廃止されているなど、おすすめできない情勢でもあります。

    // C++/CLI でなければならない理由が、C/C++ のライブラリを使うためだけだったら、ラッパー部分だけ C++/CLI にするのが楽ですが、そういったことではないのですよね?

    2012年11月12日 13:33
    モデレータ
  • 佐祐理さん

    回答ありがとうございます。

    ref classで実現することができました。

    困っていた為、とても助かりました。

    トラッキング参照だけしたい場合は、ref classで宣言するだけで参照出来るんですね。

    2012年11月26日 1:01
  • Azuleanさん

    回答ありがとうございます。

    回避したい内容には気づいていましたが、うまく質問できませんでした。

    私の質問する能力が乏しく、手間をとらせてしまって申し訳ありません。。

    C++/CLIは諸事情で使用しなくてはなりませんので、もっと勉強して理解を深めようとおもいます。。

    C++/CLIを使わなければならない理由についてはお答えできないのですが、ライブラリを使う為といったことではないです。

    2012年11月26日 1:12