2012-09-13 92 views
5

好吧,我用一個struct [在C++]編寫代碼,我不確定是否在頭文件或源文件中實現該結構。我應該在頭文件或源文件中使用構造函數實現結構體嗎?

的結構包括一個構造函數:

struct Point 
{ 
    double x; 
    double y; 

    Point(double xCo, double yCo) 
    { 
     this->x = xCo; 
     this->y = yCo; 
    } 

    int comparePoint(Point point) 
    { 
     ... 
    } 
}; 

我在頭文件中寫道:

typedef struct Point point; 

是不是不夠好,或者是一個不好的設計? 正如我在一些網站上看到的,通常在頭文件中實現一個結構體,

但是在我之前的任務中,課程的教職員工爲我們提供了一個頭文件,其中包含了對結構的聲明和不是執行。

我在這裏看到類似這個問題的其他問題,但他們沒有真正回答我的問題。

+4

在C++中,typedef是不必要的。這是一個C語言。 – Antimony

+0

這沒什麼大不了的。一個區別是,如果您將實現放在頭文件中,那麼任何函數都必須內聯(它們在上面的示例代碼中默認爲內聯)。 – john

回答

3

你可以聲明構造在頭和寫在cpp文件的實現:

struct Point 
{ 
    Point(double xCo, double yCo); 
    ... 
}; 

Point::Point(double xCo, double yCo) 
{ 
    ... 
} 

但在頭文件中必須有一個聲明,因爲編譯器依賴它來構建依賴於該結構的其他cpp文件。

+0

確定但是,[這聽起來很愚蠢,但是..]我將如何達到結構中的「x」和「y」? 如果我正在寫一個類,並且x,y被定義爲私有的,我會添加get/set函數以達到x,y變量。 這裏有必要這樣做嗎? 因爲如果我不這樣做,我得到一個錯誤。 –

+0

@NadinHaddad:如果你的x和y數據成員是'public',你不需要get/set方法:你可以使用點符號(或' - >'符號,如果你引用了結構/類實例通過指針)。 –

5

沒有答案,這取決於情況。你關心的是客戶端代碼是否可以訪問構造函數的實現,並且每次在那裏進行更改時都必須重新編譯它?如果是這樣,不要在標題中實現它。請記住,在這種情況下,在C++ structclass是等同的,所以相同的一般規則應適用於兩者。

什麼你應該做的是使用構造函數初始化列表:

Point(double xCo, double yCo) : x(xCo), y(yCo) {} 
7

C和C++中的struct用法有很大的區別。

在C中,struct聲明聲明瞭一個帶有標記而不是類型名稱的結構。因此,除非您在其周圍添加一個typedef,否則必須通過標記標記爲struct Point

在C++中,structclass的同義詞,僅在缺省構件的易用性(私人爲class,公衆struct)不同。一個類型名稱總是爲struct定義,沒有typedef,所以在C++中在struct附近添加一個typedef是不必要的。

這不會影響您聲明構造函數的方式:您可以將其內聯到標頭中,或者將其移出到實現中。無論哪種方式它都會起作用。把簡單的初始化器傳遞給頭文件中的初始化列表可能更好,而更復雜的初始化應該放在cpp文件中,但這完全取決於你。

1

考慮到在C++中,結構只是一個「默認成員可訪問性」設置爲public而不是private的類,所以我建議您在結構上完全相同,就像編寫一個類一樣。

相關問題