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 は同じクラスではありません

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::MainWindowとの2 つのクラスが含まれます。MainWindowの 1 つはUi宣言されているだけなので、ヘッダーでは不完全です。それへのポインターを宣言するなど、さまざまなことを行うことができますが、インスタンス化することはできません。

おそらく、クラスを定義し、Uiクラスをインスタンス化し、それを指すようにポインターを設定する別のソースファイルがあります。

ところで、インクルード ガードなどに予約済みの名前を使用しないでください。また、 の戻り値の型は でmainなければなりませんint

于 2013-05-22T12:31:39.337 に答える