簡體   English   中英

前向聲明和命名空間(c ++)

[英]forward declaration and namespaces (c++)

我的問題:

有兩個班,A班和B班,所以我得到了Ah和A.cpp以及Bh和B.cpp。 需要知道B和B需要知道A.我用以下方式解決了它(我不知道為什么它必須如此......)

啊:

#include "B.h"
class A{ ... 

A.cpp:

#include "A.h"

BH:

#include "A.h"
class A; // forward declaration
class B { ... 

B.cpp:

#include "B.h"

我使用了一個前向聲明並且它有效。

問題是,兩個類都需要在命名空間“ui”中。 或者至少我認為這是意思:

啊:

#include "B.h"
namespace ui{
  class A;
}

class A{ ... 

BH:

#include "A.h"
namespace ui{
  class B;
}

class B{ ... 

這不再起作用了。 現在我需要做些什么來使命名空間和前向聲明再次起作用?

兩者都必須在此命名空間中。 我正在使用Qt,需要使用“namespace ui {”等行。 兩個班級都需要相互了解。 我已經嘗試過這樣做:

namespace ui{
 class A;
 class B;
}

在兩個標題中,但這不起作用......

順便說一句:所有Header-Files也獲得了“ifndef”機制。

如果我理解你,你用這樣的結構聲明了兩種不同的類型:

#include "B.h"
namespace ui{
  class A;
}

class A{ ... }; 

在這里,您聲明命名空間ui中有一個class A ,但您在全局命名空間中定義了一個class A 因此ui::A聲明,但從未定義。 A的定義也移動到ui名稱空間:

#include "B.h"
namespace ui{
  class A;
}

//somewhere later:
namespace ui
{
  class A{ ... };
}
// A.h
namespace ui {
   class A; // forward
   class B {
   };
}



// B.h
namespace ui {
   class B; // forward
   class A {
   };
}



// A.cpp
#include "A.h"
#include "B.h"



// B.cpp
#include "A.h"
#include "B.h"

你快到了。 這應該工作:

// A.h
namespace ui {

class B;
class A {
  ...
};

} // namespace ui

// B.h
namespace ui {

class A;
class B {
  ...
};

} // namespace ui

你唯一錯的是你必須在命名空間內定義類; 在命名空間中轉發聲明它們是不夠的。

除了從其命名空間中轉發聲明類(正如其他答案正確所說),記得在引用前向聲明的類時使用 (prepend)該命名空間,或者添加using子句:

// B.h
namespace Y { class A; } // full declaration of
// class A elsewhere

namespace X {
    using Y::A;   // <------------- [!]
    class B {
        A* a; // Y::A
    };
}

參考: 命名空間和前向類聲明

這是一個非常Qt特定的問題。

當Qt Designer為您自動生成代碼文件時, Ui名稱空間是與您的類不同的命名空間。 這里實際上有兩個不同的類聲明:全局命名空間中的class AUi命名空間中的class Ui::A 第二個類包含Qt為您生成的所有控件(當您使用表單設計器時),第一個類(在全局命名空間中)具有您的所有邏輯。

我正在使用的Qt Creator版本(3.1)也將為class A (不是Ui::A )生成私有成員: private: Ui::A* ui; ,用ui->setUp(this) 然后,您可以訪問控件(例如ui->lineEdit->toPlainText();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM