C++ C++;向量类型类成员的getter
如果我有C++ C++;向量类型类成员的getter,c++,oop,C++,Oop,如果我有vector或另一个对象作为类属性,那么我应该如何实现该属性的getter?它应该返回成员本身还是它的引用?示例如下: #include "B.h" #include <vector> class A { vector<int> numbers; B obj1; public: vector<int> get_numbers() const; // or vector<int> & get
vector
或另一个对象作为类属性,那么我应该如何实现该属性的getter?它应该返回成员本身还是它的引用?示例如下:
#include "B.h"
#include <vector>
class A {
vector<int> numbers;
B obj1;
public:
vector<int> get_numbers() const;
// or
vector<int> & get_numbers() const;
B get_obj() const;
// or
B & get_obj() const;
};
#包括“B.h”
#包括
甲级{
向量数;
B obj1;
公众:
向量get_numbers()常量;
//或
向量&get_number()常量;
B get_obj()常量;
//或
B&get_obj()常量;
};
注意:我也不确定常量是否正确
vector&get_numbers()常量;
肯定不是这个。您会发现很难返回对非常量的引用,该引用引用来自常量限定成员函数的成员
vector get_numbers()常量;
这是一个选择。但也有一些考虑:
- 使用此方法无法修改成员。这很好,除非您需要修改它们
- 这需要在每次调用getter时复制向量。这可能是非常昂贵的操作
为了避免不必要的复制,您可以返回对const的引用:
const vector<int> & get_numbers() const;
const向量&get_numbers()const;
为了通过允许从getter进行move构造来避免更多不必要的复制,可以使用一组重载:
const vector<int> & get_numbers() const & ;
vector<int> && get_numbers() &&;
const vector&get_numbers()const&;
向量&&get_number();
要允许修改,可以使用非常量限定成员函数返回引用:
vector<int> & get_numbers() & ;
vector&get_number()&;
另一种方法是根本不使用getter。如果类的用户需要访问该成员,那么它可能应该是公共的
您可以提供其他形式的有限访问。一个惯用的C++方法是拥有<代码>开始<代码>和<代码>结束<代码>返回迭代器的成员函数。这将允许在不调整向量大小的情况下更改向量的内容。一个学派认为您根本不需要getter。@Shadovx您可以通过const
引用返回它,这将阻止调用方修改成员,如果不制作成员的副本,通常需要从getter@RemyLebeau不是真的。抛弃常量是完全合法的,因为底层对象不是常量。尽管如此,我同意任何不与老式API接口的代码都不应通过使用const\u cast
@Shadovx的代码审查。函数末尾的const
表示函数不会修改调用它的A
对象,因此可以安全地调用const A
对象。const
对函数返回的内容没有影响。您需要一个单独的常量
,例如:常量B和get_obj()常量
常量向量和get_numbers()常量&代码>这是一个疯狂的过载。“这不会有多大用处的。”纳萨诺利弗喊道。忘记删除常量。但这是实际使用的东西。但我无法描述确切的情况,为什么以及在哪里它会有用。可能与模板有关。我得到了vector&&get_numbers()代码>但是常量向量&&get_numbers()
真的没有什么用处,因为你不能移动常量的东西。@NathanOliver在标准库API中列出了常量和的用法列表。特别是,std::optional
在成员函数限定符中使用它。(编辑:还修复了其他常量(&E)
const vector<int> & get_numbers() const & ;
vector<int> && get_numbers() &&;
vector<int> & get_numbers() & ;