2009-06-07 144 views
3

在Visual Studio 2008中出現以下錯誤:錯誤C2248:'Town :: Town':無法訪問類'Town'中聲明的私有成員。它看起來像構造函數無法訪問它自己的類的成員。任何想法發生了什麼? 下面的代碼:構造函數不能訪問自己類的私有成員

我有這樣的:

template<class T> class Tree{...} 

這個類:

class Town{ 
    Town(int number):number(number){}; 
    ... 
private: 
    int number; 
}; 

這也是使用的這個類:

class Country{ 
public: 
    StatusType AddTown(Shore side, int location, int maxNeighborhoods); 
private: 
    Tree<Town> towns[2]; 
    ... 
} 

而這裏的AddTown功能:

StatusType Country::AddTown(Shore side, int location, int maxNeighborhoods){ 
    if (maxNeighborhoods<0 || location<0){ 
     return INVALID_INPUT; 
    } 
    Town* dummy= new Town(location);//Here be error C2248 
    if (towns[side].find(*dummy)!=NULL){ 
     delete dummy; 
     return FAILURE; 
    } 
    SouthBorder* dummyBorder; 
    (side==NORTH)?dummyBorder=new SouthBorder(location,0):dummyBorder=new SouthBorder(0,location); 
    if (southBorders.find(*dummyBorder)!=NULL){ 
     delete dummyBorder; 
     return FAILURE; 
    } 
    towns[side].add(*dummy); 
    delete dummyBorder; 
    return SUCCESS; 
} 

回答

12

默認類的訪問級別是私有的。如果你不添加public:在Town構造函數之前它將是私有的。

class Town{ 
public: // <- add this 
    Town(int number):number(number){}; 
    ... 
private: 
    int number; 
}; 
+1

謝謝。這是一個愚蠢的錯誤...... – 2009-06-07 19:25:02

-1

您申報隱藏成員變量的函數的局部變量:

城區(INT數):號碼(號碼){};

試試這個

Town(int num):number(num){};

+1

初始化列表對此有點特別。在初始化列表中,具有相同名稱的參數不會隱藏屬性。只要有可能,該參數將隱藏該屬性的名稱。當編譯器遇到':number(number)'時,第一個'number'必須是代碼編譯的屬性。第二個「數字」可以是任意的,並且參數隱藏該屬性(如構造函數塊中的任何位置)。但是OP代碼是正確的。 – 2009-06-07 19:37:51

3

此代碼有上面列出的邏輯問題。非公開聲明和隱藏通過使用相同名稱作爲內部傳遞的成員變量。

考慮到我們正在談論'數字'變量作爲例子。

在過去,比如在私有內部變量的C++成員變量中,前綴爲「m_number」。或者有些人會做'_number'。

只是'num'是一個很好的重命名,但它可能並不清楚,它只是相同的值。我想這是一個內部私有成員變量命名的問題,並沒有真正解決。

Python使用'self.number',它可以區分傳入的'number',這是一個體面的解決方案。

但是無論平臺如何,擁有一個私有變量成員命名系統總是很好,它可以幫助您避免在名稱衝突點出現黑客攻擊。

+1

+1的一般想法。但是,雖然常見,但不應在前綴中加下劃線'_',因爲標準將這些名稱保留在'實現'中,其中實現是編譯器/ STL實現者。您也可以在C++中使用'this',就像您在python中使用'self'來區分屬性與其他標識符(局部變量/參數)一樣。 – 2009-06-07 20:18:45