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()       & ;