0

one.h:

namespace one {
    class X : public IZ {
        public:
            void function(); // virtual function (=0) in IZ
    }
}

2.h

namespace one {
    class Y {
        public:
            void functionY(class X& x); // or one::X& x
    }
}

いくつかのファイルによって分散されたいくつかのクラスがあり、すべて同じ名前空間を共有しています。私が理解していることから、すべてのクラスに同じ名前空間がある場合、それらはすべて同じ名前空間に属しているため、NAMESPACE::class_x を配置する必要なく、すべて相互にアクセスできます。

私が理解したいのは、上記の特別なケースでキーワードclassor namespace::beforeを使用する必要がある理由X& xです。

で「上書き」された仮想関数としてのX継承に関連していますか?IZX

4

3 に答える 3

1

名前空間かどうかに関係なく、後で参照するクラスを宣言する必要があります。

#include "one.h"ファイル two.h で既知の定義全体を作成するか、定義せずone::Xに宣言を追加することができます。X

// two.h

namespace one
{
    class X;

    class Y
    {
        void f(X const & x);
        // ...
    };
}

いずれの場合も、既に名前空間内にいるため、名前空間を再度記述する必要はありません

于 2012-10-14T02:41:27.540 に答える
1

この場合、X 型はコンパイル時に解決されます。リンカは、X が何であるかを理解する必要があり、それはクラスであるか、名前空間にスコープされています。

  1. 同じ名前空間にスコープを設定するとnamespace::x、クラスが名前空間で定義されていないとコンパイル エラーが発生します。
  2. それをクラスとして定義し、定義が属する名前空間に同じクラスが存在する場合、その定義は解決されます。
于 2012-10-14T01:28:13.707 に答える
0

質問を閉じるには:問題は循環参照によって引き起こされました。

于 2012-10-14T22:15:36.503 に答える