[英]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 A
和Ui
命名空間中的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.