具有 2 种形式的命名空间

Namespace with 2 forms

我的命名空间 "Client" 具有表单 MainWindow 和表单 MyForm

MainWindow 创建 MyForm。

MainWindow.h

#pragma once

namespace Client {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    public ref class MainWindow : public System::Windows::Forms::Form
    {
    public:
        MainWindow(void)
        {
            InitializeComponent();
        }
....
....
....
}

在MyForm.h中我这样写:

#pragma once

namespace Client {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    public ref class MyForm : public System::Windows::Forms::Form
    {
    private:
        MainWindow ^f;  //this is my problem
    public:
        MyForm(void)
        {
            InitializeComponent();
        }
......
......
......
}

编译后,我在第MainWindow ^f;行有这个错误:

1>c:\users\user\desktop\testlist\client\MyForm.h(17): error C2143: syntax error : missing ';' before '^'
1>c:\users\user\desktop\testlist\client\MyForm.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  MyForm.cpp

如果我这样写Client::MainWindow ^f;:

1>c:\users\user\desktop\testlist\client\MyForm.h(17): error C2039: 'MainWindow' : is not a member of 'Client'
1>c:\users\user\desktop\testlist\client\MyForm.h(17): error C2143: syntax error : missing ';' before '^'
1>c:\users\user\desktop\testlist\client\MyForm.h(17): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  MainWindow.cpp

1 个错误 - 表单是 Client 的成员,为什么?

如果添加#include "MainWindow.h",错误在MainWindow ^f;:

1>c:\users\user\desktop\testlist\client\MyForm.h(19): error C2143: syntax error : missing ';' before '^'
1>c:\users\user\desktop\testlist\client\MyForm.h(19): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>  MainWindow.cpp

我该如何解决这个问题?

______________________________Update 对于 ArnonZilca

Myform - 它是一个 ref class,所以我使用 ref struct 而不是 mreoer myvar; 我写 mreoer ^myvar;

mreoer ^myvar; 中的错误:

1>c:\users\user\desktop\testlist\client\MyForm.h(20): error C2143: syntax error : missing ';' before '^'
1>c:\users\user\desktop\testlist\client\MyForm.h(20): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>c:\users\user\desktop\client\client\MyForm.h(155): error C2227: '->Print' 的左侧必须指向 class/struct/union/generic 类型 1> MainWindow.cpp

_________________________________UPDATE

所以在Myform.h中我这样写:

 #pragma once

    namespace Client {
        ref class MainWindow;
        using namespace System;
        using namespace System::ComponentModel;
        using namespace System::Collections;
        using namespace System::Windows::Forms;
        using namespace System::Data;
        using namespace System::Drawing;

        public ref class MyForm : public System::Windows::Forms::Form
        {
        private:
            MainWindow ^f;  //this is my problem
        public:
            MyForm(void)
            {
                InitializeComponent();
            }
    ......
    ......
    ......
    }

如果我在 MyForm.h 中使用此变量 (^f),我在使用它的行上会出现此错误:

\users\user\desktop\client\client\MyForm.h(155): error C2027: use of undefined type 'Client::MainWindow'
1>          c:\users\user\desktop\client\client\MyForm.h(8) : see declaration of 'Client::MainWindow'

MainWindow 有 public 方法 void Print () { cout << "HEY" << endl; }

在 MyForm.h 我这样做:f->Print();

您似乎忘记包含定义了 Client::MainWindow 的 header

对于习惯了较新语言的程序员来说,这往往有点粗糙。但这是正常的一种问题,C++/CLI 继承了 C++ 语言的编译模型。它是一个单程编译器,在使用它们之前必须知道所有定义。一个可以追溯到上个世纪的模型,当时 64KB 的 RAM 可以装在鞋盒里,还需要一条胳膊和三条腿。

从技术上讲,它并没有那么糟糕,C++ 更像是一个 1.5 遍编译器。您 可以 提前参考内联函数定义中的 class 成员。这并不能完全帮助诊断此类问题:)

但是你必须在这里做 C++ 舞蹈,你的 MyForm.h 文件可以包含前向声明,ref class MainWindow; 完成。但是任何取消引用 f 成员的代码必须只出现在 MyForm.cpp 文件中。该 .cpp 文件可以 #include MyForm.h 和 MainWindow.h 所以所有类型定义都可用。是的,确实 意味着您可能必须将设计者添加的方法从 .h 文件移动到 .cpp 文件。不要惊慌,这是正常的。