2015-10-20 92 views
0

所以我發現了在類中定義私有變量的問題。在C++類中定義私有變量/屬性

此刻,我Apple.h文件看起來像這樣:

#ifndef Apples_h 
#define Apples_h 

class Apples { 
    public: 
     Apples(); 
     void eat(); 
     void peel(); 
     void slice(); 

    private: 
     int _seeds; 
     String _type; // originally int by mistake 
}; 

#endif 

我Apple.cpp文件看起來像這樣:

#include "Apples.h" 

int _seeds = 0; // default 
String _type = 0; // default 

Apples::Apples(){ 
    _seeds = 5000; 
    _type = "notYummy"; 
} 

// pretend all the public methods are implemented and are fine (no issues with them) 

這實際上工作得很好:我已經定義了一個私人屬性_seeds在我的頭文件和.cpp文件中。

當我在別的地方定義一個屬性時,問題就出現了,比如在父類/主文件中。

然後它抱怨說它有多個定義。對我來說,這有點奇怪,因爲我認爲Apple.cpp中的_seeds屬性應該是私有的(並且因此是未知的),但是它以某種方式將它拾取並衝突到另一個文件中。

我查找了一個製作類的例子,他們沒有在.cpp文件中定義類屬性,但只在頭文件中,它似乎神奇地創建了這些私有屬性。 cpp文件(它們沒有在.cpp文件中的任何位置定義)。

我的「最接近的」語言可能是Java,在那裏我定義了類實現文件中的所有類變量/屬性,所以我有點困惑。

任何人都可以證實:

  1. 這不是C/C++而言,您應該只定義在頭文件中的專用屬性。

  2. 類.cpp文件中的任何變量/屬性都是一些如何在'全局命名空間'中,他們可以在其他文件中碰撞。

而且,如果第二點是真實的,能將它們實際上只是調用另一個類/文件_seeds訪問?

,如果你把它們寫在類外(它可能不會,因爲我認爲這僅僅是一個語言的東西無所謂,但是這是代碼一個Arduino。)

+0

這聽起來對我來說是不可能的。課堂中的屬性僅限於課堂。你能發佈你的代碼嗎? – Chiel

+2

TL; DR:應該將_type作爲int還是一個string? –

+1

請不要在變量名前面加下劃線 - 每個以下劃線開頭的名字都保留給實現,用作全局名稱空間中的名字 – Constantin

回答

2

你定義兩個全局變量新, :

int _seeds = 0; // default 
String _type = 0; // default 

你只需要像你那樣初始化ctor中的非靜態成員變量。

+0

中?如果這意味着.cpp文件,那麼我猜測點1是正確的然後:只在頭文件中定義,並且只在.cpp文件中初始化? – mitim

+0

哦,「構造函數」。沒想到直到幾分鐘後纔看到它。 =/ – mitim

+0

@mitim成員變量在類定義中定義,並在類作用域內使用(初始化),包括成員函數(和構造函數)。無論如何,你不能直接在全球範圍內使用它們。 – songyuanyao

1

必須聲明全部 C++中的一個類的屬性和方法。傳統的方法是在頭文件中完成,因此包含該頭文件的所有文件都可以使用該類(它們需要完整的聲明才能完成)。但是,.cpp文件中的類聲明也是有效的,但僅在該文件中才會提供此類。

您的代碼

int _seeds = 0; // default 
String _type = 0; // default 

沒有關係到類。這只是兩個全局變量的定義。您可以設置非靜態屬性的初始值的唯一方法是在構造函數中,您在問題中完成它的方式看起來是正確的(假設您使用字符串類型而不是int聲明Apples::_type)。

+0

沒錯。其他人在答案中提到了這一點,但你已經再次證實了這一點,也提到了我的第二點。謝謝。是的,你又是對的,int應該是_type的一個字符串。我通常會編輯我的問題並修復這個錯字,但可能會讓其他人在將來想知道它指的是什麼。 – mitim

+0

@mitim我肯定會編輯問題中的屬性類型,並在註釋中留下提示(例如'String _type; //最初是錯誤的int)。一個好問題應該解決一個問題,否則它會變得混亂。 – Melebius

+0

好的,好點。 – mitim