4

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

#ifndef _c1_
#define _c1_

namespace classspace
{
    class Aclass;
}

class Aclass
{
    //body
};

#endif _c1_

我将此标头添加到 main.cpp 并在 main() 中创建了一个对象,但它返回的错误是undefined class 'classspace::Aclass' 我的主要

void main()
{
    classspace::Aclass b;
}

当我将类定义为

class classspace::Aclass
{
    //body
};

错误已解决。我使用第一种方法在 Qt 主窗口文件中看到:

#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

工作没有任何错误。我在第一种方法中的错误是什么?

4

6 回答 6

10

类定义必须在您声明该类的同一个命名空间中。

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

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

Ui::MainWindow* ui;

这个类的定义放在其他地方(在不同的 .cpp 文件中)它应该在Ui命名空间中的位置,或者以命名空间为前缀的定义。

于 2013-05-22T12:36:08.440 回答
5
namespace classspace
{
    class Aclass;
}

这在命名空间内声明了一个类。

class Aclass
{
    //body
};

这在全局命名空间中声明并定义了一个同名的不同类

class classspace::Aclass
{
    //body
};

这定义了您之前在命名空间中声明的类。

void main()
{
    classspace::Aclass b;
}

这试图实例化在命名空间中声明的类。如果该类尚未定义(仅声明),则它不完整且无法实例化。

Qt 示例涉及两个类:Ui::MainWindowMainWindow在全局命名空间中。Ui仅声明了其中的一个,因此标题中的内容不完整。你可以用它做各种事情,比如声明一个指向它的指针,但你不能实例化它。

据推测,有一个单独的源文件定义Ui类,实例化一个,并将指针设置为指向它。

顺便说一句,您不应该为包含警卫或其他任何东西使用保留名称。此外,返回类型main必须是int.

于 2013-05-22T12:31:39.337 回答
0
namespace classspace
{
    class Aclass;
}

class Aclass
{
    //body
};

这两个类是两个不同的类(同名)。

您正在使用classspace::Aclass尚未定义的。在命名空间中添加主体:

namespace classspace
{

class Aclass
{
    //body
};

}
于 2013-05-22T12:30:01.183 回答
0

您在命名空间内声明类,但在命名空间外定义它。所以声明是:

classspace::Aclass

但定义定义了以下实现:

::Aclass

命名空间应与声明和定义相匹配。

于 2013-05-22T12:30:08.917 回答
0

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

namespace MyNamespace
{
  class MyClass
  {
  };
}

如果你想像你的第一个例子那样做,那么你必须转发声明它。例如,

namespace MyNamespace
{
   class MyClass;
}

class MyClass
{
    //body
};
于 2013-05-22T12:30:53.043 回答
0

想象

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

class AClass
{
}

int main()
{
  AClass myClass;
}

我们使用的是哪一个?foo还是goo

您必须指定,或者通过使用命名空间名称调用 AClass 的所有用途, ie foo::AClass,或者通过将它的所有用途放在里面

namespace foo
{

}
于 2013-05-22T12:33:59.980 回答