2011-05-06 97 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;