2012-12-27 64 views
1

我對構造類作爲成員的語法存在一些疑問。類內部的結構

我有這樣的結構:

/* POS.H */ 
#ifndef POS_H 
#define POS_H 
struct pos{ 
    int x; 
    int y; 

    pos operator=(const pos& a){ 
     x=a.x; y=a.y; 
     return a; 
    } 

    pos operator+(const pos& a)const { 
     return (pos){a.x+x,a.y+y}; 
    } 

    bool operator==(const pos& a)const { 
     return (a.x==x && a.y== y); 
    } 
}; 
#endif /* POS_H */ 

,並在另一個文件中存在的主要功能是:

/* MAIN.CPP */ 
#include "pos.h" 
#include "clase.h" 
int main(){ 
    pos pos; 
    pos.x=0; 
    pos.y=0; 
    clase clase(); 
} 

再就是對於其包含類CLASE文件clase.h 3項不同的內容。

編譯沒有問題:

#include "pos.h" 
class clase{ 
    private: 
     pos posi; 
    public: 
     clase(pos pos):posi(pos){}; 
}; 

這並不編譯(只是改變了成員的名稱):

#include "pos.h" 
class clase{ 
    private: 
     pos pos; 
    public: 
     clase(pos pos):pos(pos){}; 

這也編譯罰款(使用POS機爲NEME但使用關鍵字struct ):

#include "pos.h" 
class clase{ 
    private: 
     struct pos pos; 
    public: 
     clase(struct pos pos):pos(pos){}; 
}; 

我的問題是:爲什麼這些代碼編譯或不?

+0

因爲成員的名稱與類型相同(均爲'pos')。這是行不通的。 – jogojapan

+5

這不是在做你認爲'clase clase();'這是一個函數的前向聲明。你可能的意思是'clase clase;' –

+2

關閉投票人:答案可能沒有太大的實用價值,但它仍然是一個關於語言規則的簡單客觀問題,任何在編譯器,重構工具等工作的人都需要看看。 –

回答

1

這是歷來沒有良好的編碼習慣來命名相同結構名成員,看起來就像當你試圖聲明,除非你執行結構類型的私有成員名爲POS編譯器越來越困惑。

總而言之,它只是命名衝突,你應該養成與結構或對象名稱略有不同的命名習慣。也許在TitleCase中命名你的結構和對象,然後在你的成員上使用camelCasing。在這個例子中,命名結構POS,然後在私有類中:POS mPos;

+1

好吧,但好奇的是,編譯器允許具有相同的名稱爲結構和主要功能內的變量,它不是在這種情況下它是類的成員 – user1754322

+0

對不起,我不'不知道爲什麼它是一個問題,但有時候是這樣。我不是故意強迫「按照我說的做」的答案,但使用編碼約定更好一些,它會以某種方式使成員命名和結構/對象命名總是不同,以避免遇到此問題第一個地方。 – 2012-12-27 17:13:09