2013-07-27 59 views
0

我一個代碼庫,是不是我自己的,具有以下佈局工作:解決納入訂購

object.h:

// Objects are defined 
// #include "tickets.h" (functions to access the objects) 
// An access-handler object is defined 

我要介紹的是知道的對象類,可以從tickets.h中的函數中訪問,但也可以使用訪問處理器對象。該功能是分開的,這被稱爲在tickets.h不使用接入處理程序,即類函數(我不知道從哪裏開始如果不是這樣的話)。

因此,我的類需要tickets.h之前定義,但它的一些功能需要訪問處理程序之後加以界定。有沒有辦法做到這一點,不要把它分成兩個頭文件類似以下內容:

// Objects are defined 
// -- include declaration of class, and definition of functions that tickets.h needs 
// #include "tickets.h" 
// An access-handler object is defined 
// -- include functions of class that need the access-handler 

這似乎很凌亂分裂的東西像這樣成兩個獨立的文件,我希望把一切都遏制。

感謝您的幫助,我很清楚只有在C++中聲明/定義的一個非常基本的瞭解。

編輯:如果我使用forward聲明並在tickets.h之前包含它(在mynewclass.h中聲明的類和在mynewclass.cc中定義的函數)mynewclass.cc將能夠使用包含mynewclass.h?即訪問處理程序對象。

EDIT2:事情是這樣的:

object.h:

class obj { // definition } 

#include "tickets.h" 

class obj_handler { 
    public void handle { // code } 
} 

tickets.h:

void do_something(obj o){ 
    communicator.foo(); 
} 

我對象(傳播者):

class communicator { 
    public: 
     void foo() { // code } 
     void bar() { // use handle() from obj_handler } 
} 

由於你可以看到,我的傳播者需要被使用d在tickets.h中,但直到obj_handler之後才能定義。那麼我應該在哪裏包括它?

+0

你能不能給代碼中最小的例子嗎?因爲我根本不理解這個問題。例如,爲什麼要在頭文件中定義對象?您將以每個翻譯單元中的這些對象的多個副本結束。除非你的意思不同,在這種情況下,只有示例代碼可以幫助我們理解你的意思。 –

+0

我將新功能引入不屬於我自己的系統,其中大部分功能實際上都在頭文件中實現。我想我可以嘗試一小段代碼來解釋我的意思。 – ricky116

回答

2

如果我正確理解你的問題 - 你可以使用前置聲明來解決這個問題。這將允許你在定義它的方法之前聲明一些類。例如:

// this is forward declaration of class A, no definition provided 
class A; 

class B 
{ 
// uses A 
A * a_; 
}; 

// class A definition 
class A 
{ 
// may use class B now 
B * b_; 
}; 
1

我不太確定我是否理解這個權利,沒有足夠的聲譽這裏還沒有做出這樣的評論,所以讓我嘗試回答你的問題這樣一來,請隨時跟進,如果我猜錯:

我相信你指的是一個完整的類定義,即,一個包括類聲明中的所有功能定義。除此之外,看到預處理器指令後面的對象定義並不常見。典型的是函數和類原型的前向聲明。

class C 
{ 
public: 
    void method1(void); 
    int method2(void); 
}; 

而且在一些implementation.cpp的功能,如定義:

void C::method1(void) { /*...*/ } 

在前面的包括鏈中的其他文件

因此,舉例來說,你可以在一些header.h聲明通過您的訪問處理程序,然後定義其他功能:

int C::method2(void) { /*...*/ } 

順便說一下,access-handler是什麼意思?

哦,如果你在頭文件中做函數定義,你的鏈接器可能會對你稍微大叫一聲。


關於您的補遺:你到處放了向前聲明,嚴格地講,編譯器會插入有關的聲明副本,認爲這是在文件系統的上下文中的軟鏈接。如果你有很多函數簽名或類的前向聲明,那麼它會帶來負面的影響,比如增加持續時間和編譯的內存負載。由於只有您知道實際的代碼,因此無法分辨這是否會在您的特定情況下發聲。但最有可能的是它會工作。

在這些網頁看看:

  1. http://en.wikipedia.org/wiki/Forward_declaration
  2. When can I use a forward declaration?
+0

或者還有什麼鯨 - 小牛寫 – Nicholas

+0

我只限於每個答案只有2個鏈接,這裏是列表的其餘部分:3. http://www.chromium.org/developers/coding-style/cpp-dos-和 - 4. http://www.learncpp.com/cpp-tutorial/19-header-files/ – Nicholas