2011-05-06 96 views
0

我想讓我的集合在我的類之外不可變。C++按值返回集合

從這個:

public:  
    vector<int>& getValues(){ 
     return values; 
    } 
private: 
    vector <int>& values; 

這樣:

public:  
    vector<int> getValues(){ 
     return values; 
    } 
private: 
    vector <int>& values; 

將它正常工作?

+0

你試過了嗎?這很容易做... – Simone 2011-05-06 09:47:56

+0

您確定要參考成員嗎? – fredoverflow 2011-05-06 09:48:26

+2

引用作爲成員方法的使用不是*錯誤*,但它通常也不常見,並且它不能代替*「我想使我的集合**在我的類**之外是不可變的** 「*。那裏的參考意味着該集合不是由班級擁有*。我的第一個猜測是,你不想存儲一個引用,但沒有更多的代碼或更完整的描述,我只是將註釋留給你去思考。 – 2011-05-06 10:03:07

回答

3

它會工作,但你會過得更好返回一個const引用:

const vector<int> & getValues() const { 
    return values; 
} 

而且,存儲在類的引用通常(並不總是)是錯誤的。你可能想要一個值,或者可能是一個指針。

1
public:  
    vector<int> getValues(){ 
     return values; 
    } 
private: 
    vector <int>& values; 

不可能按原樣工作,對你的向量實際引用的引用是什麼?除非你沒有在這裏顯示所有的代碼,否則它不會工作。

只需要有一個vector<int> values;

+0

這可能不是一個好主意,但是如果引用在類'ctor中初始化,它就可以工作。 – Simone 2011-05-06 09:50:22

+0

他顯然沒有顯示所有的代碼,因爲具有引用成員的類需要(總是)用戶定義的構造函數。我對參考成員本人持懷疑態度,但與他的實際問題無關。 – 2011-05-06 09:51:36

+0

但我所說的在技術上不是錯誤的?我不明白downvote, – 2011-05-06 09:54:20

3

是的,但是如果集合很大並且經常調用該函數,它可能會對性能產生負面影響。剛退回vector<int> const&(並聲明getValues()const)有什麼問題?

此外,我想知道你的會員是一個參考的事實。成員應該很少被引用。

1

是的,你可以這樣做,但這不一定是你想要的。

通過這樣做,您的getValues方法將複製矢量。這將需要一些時間(取決於矢量的大小)。

如果您確信該矢量不經常改變,爲什麼不返回一個const引用,就像這樣:

const vector<int> &getValues() {return values;} 
1

回報const_iterators一個pair,那麼被叫從基礎容器抽象了。 ..

eg

typedef std::vector<int> vector_type; 
public: 
    typedef std::pair<vector_type::const_iterator, vector_type::const_iterator> range; 

    range getValues() const 
    { 
    return range(values.begin(), values.end()); 
    } 
private: 
    vector_type values;