2011-06-22 131 views
12

我的問題:向前聲明和命名空間(C++)

有兩個類,類A和B,所以我就A.H和A.cpp和B.h和B.cpp。 A需要知道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」中。或者至少我覺得這個意思:

A.H:

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

class A{ ... 

B.h:

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

class B{ ... 

這不工作了。我現在必須做些什麼才能使它再次與名稱空間和前向聲明一起工作?

兩者都必須位於此名稱空間中。我正在使用Qt,並且需要使用「namespace ui {」等。兩個班都需要彼此瞭解。 我已經嘗試只是爲了讓這樣的:

namespace ui{ 
class A; 
class B; 
} 
兩個頭

,但這並不工作...

BTW:所有頁眉文件也得到了「IFNDEF」 -mechanism。

+3

什麼是「這不起作用了嗎?」是什麼意思?請發佈確切的編譯器/鏈接器錯誤 – fredoverflow

回答

6
// 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" 
3

你快到了。這應該工作:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

你有錯的唯一的事情是,你必須要定義命名空間中的類;在命名空間內轉發聲明是不夠的。

+0

我無法做到這是自動生成的文本由QT-設計師。它只是做到了這一點。我不知道爲什麼。順便說一句,在我的第一個例子中,我聲明爲工作,我還需要兩個前向聲明 – Obs

+0

您可能已經注意到,你有三個答案都說幾乎完全一樣的東西?如果QT-Designer不能被說服把它的類定義放到「'namespace ui {'...'}'」塊中,那麼你就會被這些類所困全局命名空間。 – zwol

13

如果我理解你的權利,你聲明2種不同類型的這樣的結構:

#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{ ... }; 
} 
0

這是一個非常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();