2017-02-28 41 views
0

我寫了代碼,其中我定義了main之外的結構,用於類的排隊鏈接列表。它基本上是這樣的:如何在使用頭文件和cpp文件時定義結構?

class Queue 
{ 
public: 
    void enqueue (int x); 
    void dequeue(); 
    void print(); 
}; 

struct queueNode 
{ 
    int data; 
    queueNode * next; 
    queueNode * prev; 
}; 

queueNode * head; 
queueNode * tail; 
queueNode * n; 

//class functions that use head, tail, and n 


int main() 
{ 

//functions that use head, tail, and n 

return 0; 
} 

這是一個非常非常簡潔的版本,但你得到的圖片。

問題是,現在我把它分成不同的文件,我不知道把頭,尾或n放在哪裏。

如果我把它們放在標題中,它們沒有被括起來,所以它們不能只是頭文件的尾部。

如果我把它們放在實現文件中,它們不能被main訪問。我不能#include實現文件,因爲它是一個重新定義。

如果我把它們放在main中,它們對於實現文件是不可訪問的。

我應該把這些放在哪裏?是否有某種約定?

+4

他們不應該在'排隊'? – tkausl

+2

感謝您的回覆。如果他們在隊列中,Main中沒有任何東西似乎能夠看到他們......編輯:神聖的F,我很笨。您的評論讓我看到了解決方案,即將任何引用從主要引用並將其放入實現文件中的函數中。謝謝! – FKAjasmine

回答

1

我會做這樣的:

類和結構的聲明 - >到的報頭(或單獨的標頭)。節點變量將被放置到源文件(c或cpp),以便不直接從外部訪問;如果其他源文件需要訪問它們 - 您可以爲此提供獲取/設置功能。對於源文件,如果它們不是內聯的,也應該實現類的方法。

+0

哇,我很愚蠢。這正是如何解決這個問題,非常感謝你! – FKAjasmine

-1

在Queue類中嵌套節點類,使Queue的尾部,頭部和n個成員。

class Queue { 
public: 
    struct Node { 
    int data_; 
    Node * next_; 
    Node * prev_; 
    Node (const Node& n) : next_ (n.next_), prev_ (n.prev_){} 
    }; 
    void enqueue (int x); 
    void dequeue(); 
    void print(); 
    Node* n() const {return n_;} //read only 
    Node*& n() {return n_;}  //read and write 
private : 
    Node * head_; 
    Node * tail_; 
    Node * n_; 
}; 

在主,就可以進入構件尾和隊列清楚,有關隊列一切都在一個單一的文件:

int main() { 
    //functions that use head, tail, and n 
    Queue queue; 
    Queue::Node *node (queue.n()); 
    return 0; 
} 
0

如果你想有

queueNode * head; 
queueNode * tail; 
queueNode * n; 

通過你的主函數可以訪問,你通常會把它們放在一個頭文件中以包含在你想要的位置(因爲包括一個頭文件只是複製粘貼它)或者只是將它們聲明在主函數之上在main.cpp文件中調用。就那麼簡單。

就像所說的,儘管通常最好將頭文件中的定義(類/結構和成員綱要)放在頭文件中。並充實源文件中的功能。

通常在聲明一個變量/對象的時候,你需要在它的旁邊做它,除非需要多個地方,在這種情況下,只需將它與包含守衛的頭部對齊就可以實現。 實施例:

的main.cpp

#include "queue.h" 
#pragma once 

queueNode * head; 
queueNode * tail; 
queueNode * n; 

//class functions that use head, tail, and n 


int main() 
{ 

//functions that use head, tail, and n 

return 0; 
} 

queue.h

class Queue 
{ 
public: 
    void enqueue (int x); 
    void dequeue(); 
    void print(); 
}; 

struct queueNode 
{ 
    int data; 
    queueNode * next; 
    queueNode * prev; 
}; 

隊列。cpp

#include "queue.h" 
//queue and other methods should go here. 

只記得如果你編譯多個源文件沒有IDE你需要將它們連接在一起。

+0

說實話,我幾乎像聖的答案,我不知道它爲什麼是負面的。如果你想防止污染全球空間,並希望讓他們有點公開,他的方法可能是最好的主意。 – user3440251

相關問題