2013-11-20 76 views
0

例如,vector<double> A(5);可以返回5個元素的矢量。是否有可能在我們自己建造的class中做類似的事情?如何在課堂上輕鬆創建矢量或陣列以及如何訪問它們

例如,我有一個叫Fruit的課。我應該寫什麼構造函數,以便Fruit A(5);可以返回我5​​。這意味着​​是此類的私人成員,應該是大小爲5的數組或向量。我沒有寫出​​的詳細信息的原因是我不知道如何在成員中正確聲明它並創建它的構造函數。

最後,在創建Fruit A(5);之後,我是否只能通過在類中創建一個get()函數來訪問此數組的成員,或者有更方便的方法嗎?

非常感謝,如果你能給我一些建議。謝謝!

回答

2

最簡單的策略是讓你的課程包含一個容器。使它成爲一個公衆成員,如果你不希望有寫存取它:

class Fruit 
{ 
    public: 
    Fruit() { } 
    Fruit(int asize) : basket_(asize) { } 

    vector<apple> basket_ ; 
} ; 

那麼你會創建它:

Fruit A(5) ; 

// get an apple from Fruit 
apple tmpapple= A.basket_[1] ; 
+0

唉!老實說,他們都是不好的建議。 'std :: vector'沒有虛擬析構函數,所以從'std :: vector'繼承是一個壞主意。如果'蘋果'不能在課堂以外進行操作,請封裝它,不要暴露它! –

+0

謝謝你的回答,但我不確定它是如何工作的。例如,當我們甚至沒有定義C時,它是什麼意思C(大小)?不太熟悉繼承 – Cancan

+1

@Cancan:我們已經將'C'定義爲一個類成員,因此初始化列表中的'C(size)'意味着「通過將'size'作爲參數傳遞給它的構造函數來初始化'C'」。這裏不要擔心遺傳;正如Vite所說,從標準容器繼承是一個壞主意。 –

3

你想存儲​​在vectorarray。然後你想重寫[] operator來訪問你想要的東西。因此,像:

class Fruit 
{ 
    private: 
    vector<apple> apple_storage; 
    public: 
    int& operator[](int j) {return apple_storage[j];} 
}; 

然後你就可以很容易地使用A[3]訪問您的apple_storage

+0

該死的,操作員壓倒一切,我怎麼會忘記!老兄,非常感謝。這非常有幫助! – Cancan

0

沒有太多的細節到apple,並假設他們有一個默認的構造函數,這是一個天真的方式。

class Fruits { 
public: 
    typedef std::vector<apple> AppleArray; 
    typedef AppleArray::iterator AppleIterator; 
    typedef AppleArray::const_iterator AppleConstIterator; 

    Fruits(int appleCount) 
     : mApples(appleCount) 
    { 
    } 

    ~Fruits() 
    { 
    } 

    apple& getAppleAt(size_t index) 
    { 
     return mApples.at(index); 
    } 

    const apple& getAppleAt(size_t index) const 
    { 
     return mApples.at(index); 
    } 

    AppleIterator getAppleBegin() 
    { 
     return mApples.begin(); 
    } 

    AppleIterator getAppleEnd() 
    { 
     return mApples.end(); 
    } 

    AppleConstIterator getAppleBegin() const 
    { 
     return mApples.begin(); 
    } 

    AppleConstIterator getAppleEnd() const 
    { 
     return mApples.end(); 
    } 

    size_t getAppleCount() const 
    { 
     return mApples.size(); 
    }  
private: 
    std::vector<apple> mApples; 
}; 

我假設這是沒有生產代碼,它是純粹的學習C++。如果您要在現實生活中設計類似的東西,您需要考慮AppleFruitFruits更像是一個或多個水果,其中一個是Apple。在這種情況下,您的Fruits會更像std::vector<Fruit*> fruits;,然後使用循環初始化fruits列表中您想要的Apple的數量。