0

これは Winform1 です:

#include "Winform2.h"
#include "Winform3.h"

namespace Winform1 {

    /// <summary>
    /// Summary for Winform1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Winform1: public System::Windows::Forms::Form
    {
    public:


    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Button^  button2;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Label^  label3;
    private: System::Windows::Forms::Button^  button3;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Label^  label4;
    private: System::Windows::Forms::Button^  button4;
    public: 
        unordered_map<int, std::string>* fb_contas_email;
        Usuario* usuario;



        WinForm1(Usuario* user, 
            unordered_map<int, std::string>* fb_contas_)
        {
            this->fb_contas_email = fb_contas_;
            this->usuario = user;
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

             this->Visible = false;
             this->Close();
             WinForm2 wf2(this->usuario);  
                         wf2.ShowDialog();


         }

       private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {

             this->Visible = false;
             this->Close();
             WinForm3 wf3(this->usuario);  
                         wf3.ShowDialog();


         }
 //...

これは Winform2 です:

#include "Winform1.h"

namespace Winform2 {

    /// <summary>
    /// Summary for Winform2
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Winform2: public System::Windows::Forms::Form
    {
    public:


    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Button^  button2;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Label^  label3;
    private: System::Windows::Forms::Button^  button3;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Label^  label4;
    private: System::Windows::Forms::Button^  button4;
    public: 
        unordered_map<int, std::string>* fb_contas_email;
        Usuario* usuario;



        WinForm2(Usuario* user, 
            unordered_map<int, std::string>* fb_contas_)
        {
            this->fb_contas_email = fb_contas_;
            this->usuario = user;
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {

             this->Visible = false;
             this->Close();
             WinForm1 wf1(this->usuario);  
                         wf1.ShowDialog();


         }
 //...

これはWinforms 3です:

namespace Winform3 {

    /// <summary>
    /// Summary for Winform3
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Winform3: public System::Windows::Forms::Form
    {
    public:


    private: System::Windows::Forms::Button^  button1;
    private: System::Windows::Forms::Button^  button2;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Label^  label3;
    private: System::Windows::Forms::Button^  button3;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::Label^  label4;
    private: System::Windows::Forms::Button^  button4;
    public: 
        unordered_map<int, std::string>* fb_contas_email;
        Usuario* usuario;



        WinForm3(Usuario* user, 
            unordered_map<int, std::string>* fb_contas_)
        {
            this->fb_contas_email = fb_contas_;
            this->usuario = user;
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
 //...

このエラーを解決するにはどうすればよいですか? Winform1 から Winform2 へ、またはその逆に行き来する必要があります。しかし、おそらくダイアログを表示するときに未定義のクラスのエラーがスローされます。しかし、そのダイアログを再度呼び出して戻ってくるには、インクルードが必要です。

私は何をすべきか?winform1 と winform2 の間を行き来するためにダイアログを表示する必要があります

前もって感謝します

4

1 に答える 1

1

これらのコード サンプルはコード (.cpp) ファイルですか、それともヘッダー ファイルですか?

ヘッダー ファイルとコード ファイルを C++ スタイルで分離する必要があるように思えます。コードを取得して、ヘッダー ファイルのみのクラス定義と .cpp ファイルのみのクラス実装に分割すると、このコンパイラ エラーはなくなります。


ここで何が起こっていると思いますか: Winform 1、2、および 3 がそれぞれ宣言され、同じファイルに実装されています。これは、2 つのクラスがそれぞれ相互に参照する必要がある場合に問題を引き起こします。次のコード サンプルを見てください。2 つのクラスがそれぞれ相互に参照しています。

Class1.h:

#pragma once
#include "Class2.h"
public ref class Class1
{
public:
    void Foo() { Class2^ two = gcnew Class2(); two->Bar() }
    void Baz() { }
}

Class2.h:

#pragma once
#include "Class1.h"
public ref class Class2
{
public:
    void Bar() { Class1^ one = gcnew Class1(); one->Baz() }
}

さて、これら 2 つのファイルをコンパイルすると、それが起こるでしょうか? Class1.h は Class2.h をインクルードしようとします。Class2.h は Class1.h をインクルードしようとしますが、#pragma once. (ヘッダー ファイルにそれか #ifdef ガードがあると仮定しています。) コンパイルしようとすると、Class2 の定義が表示され、続いて Class1 の定義が表示されます。CLass2 をコンパイルすると、Class1 はまだ定義されていないため、コンパイル エラーが発生します。

ここでの解決策は、各クラスを個別のヘッダー ファイルとコード ファイルに分けることです。修正された例を参照してください:

Class1.h:

#pragma once
public ref class Class1
{
public:
    void Foo();
    void Baz();
}

Class1.cpp:

#include "Class1.h"
#include "Class2.h"

void Class1::Foo() { Class2^ two = gcnew Class2(); two->Bar() }
void Class1::Baz() { }

Class2.h:

#pragma once
public ref class Class2
{
public:
    void Bar();
}

Class2.cpp:

#include "Class2.h"
#include "Class1.h"

void Class2::Bar() { Class1^ one = gcnew Class1(); one->Baz() }
于 2012-04-15T16:25:40.330 に答える