Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在命名空间中定义类的方法_C++_Qt_Class_Namespaces - Fatal编程技术网

C++ 在命名空间中定义类的方法

C++ 在命名空间中定义类的方法,c++,qt,class,namespaces,C++,Qt,Class,Namespaces,我在标题中的命名空间中定义了一个类,如下所示 #ifndef _c1_ #define _c1_ namespace classspace { class Aclass; } class Aclass { //body }; #endif _c1_ 我将这个头添加到main.cpp,并在main()中创建了一个对象,但返回的错误是未定义的类'classspace::Aclass' 这是我的主要工作 void main() { classspace::Aclass

我在标题中的命名空间中定义了一个类,如下所示

#ifndef _c1_
#define _c1_

namespace classspace
{
    class Aclass;
}

class Aclass
{
    //body
};

#endif _c1_
我将这个头添加到main.cpp,并在main()中创建了一个对象,但返回的错误是
未定义的类'classspace::Aclass'
这是我的主要工作

void main()
{
    classspace::Aclass b;
}
当我把类定义为

class classspace::Aclass
{
    //body
};
错误已解决。 我使用第一种方法在Qt mainwindow文件中看到:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口
正在工作,没有任何错误。 第一种方法中我的错误是什么

namespace classspace
{
    class Aclass;
}

class Aclass
{
    //body
};
这两个类是两个不同的类(名称相同)

您正在使用尚未定义的
classspace::Aclass
。在名称PCE中添加正文:

namespace classspace
{

class Aclass
{
    //body
};

}

在命名空间内声明类,但在命名空间外定义它。因此,宣言是:

classspace::Aclass
但定义定义了以下各项的实施:

::Aclass

名称空间应该与声明和定义匹配。

名称空间本质上是包。在您的Qt示例中,类是前向声明的。使用名称空间的一种方法如下:

namespace MyNamespace
{
  class MyClass
  {
  };
}
如果您想像您的第一个示例那样执行它,那么您必须向前声明它。比如说,

namespace MyNamespace
{
   class MyClass;
}

class MyClass
{
    //body
};
这将在命名空间内声明一个类

class Aclass
{
    //body
};
void main()
{
    classspace::Aclass b;
}
这将在全局命名空间中声明并定义具有相同名称的不同类

class classspace::Aclass
{
    //body
};
这定义了以前在命名空间中声明的类

class Aclass
{
    //body
};
void main()
{
    classspace::Aclass b;
}
这将尝试实例化命名空间中声明的类。如果尚未定义(仅声明)该类,则该类不完整,无法实例化

Qt示例涉及两个类:
Ui::MainWindow
,以及全局命名空间中的
MainWindow
Ui
中的一个仅被声明,因此在标题中不完整。可以使用它执行各种操作,例如声明指向它的指针,但不能实例化它

大概有一个单独的源文件,它定义
Ui
类,实例化一个类,并设置指向它的指针

顺便说一句,你不应该使用你的包括警卫,或其他任何东西。另外,
main
的返回类型必须是
int

namespace foo
{
  class AClass;
}
namespace goo
{
  class AClass;
}

class AClass
{
}

int main()
{
  AClass myClass;
}
我们用哪一个<代码>foo或
goo

您必须通过使用名称空间名称调用AClass的所有用法(即
foo::AClass
)或将其所有用法放在

namespace foo
{

}

该类定义必须与您在其中声明该类的命名空间相同

至于Qt示例,在名称空间之外声明的MainWindow不是同一个类

它使用。命名空间中声明的MainWindow类用作在外部声明的MainWindow类中的成员,并使用其命名空间限定:

Ui::MainWindow* ui;

此类的定义放在另一个地方(在不同的.cpp文件中),它应该位于
Ui
命名空间中,或者定义前缀为命名空间。

您可以显示Qt源代码吗?请再次查看问题我已经添加了它。您没有在头文件中“定义”
Aclass
。你宣布了。有什么特别的原因让你投否决票吗?我想纠正我犯的任何错误。是的-他回答了你的问题,你的类是在名称空间之外定义的,它不是同一个类谢谢!!甚至我检查了qt文件的cpp,它并没有名称空间,但它有一些自动生成的支持文件,这些文件将类定义到名称空间中,这实际上消除了我的疑问。
class Aclass
{
    //body
};
void main()
{
    classspace::Aclass b;
}