返回矢量大小的 getter 应该返回什么类型的值
What type of value should it be returned by getters that return size of vector?
返回向量大小的 getter 应该返回什么类型的值?
例如,我的项目中有许多以下类型的 getter,并且我需要(int)
强制转换来删除编译警告:
int getNumberOfBuildings() const { return (int)buildings.size(); }
C++03 方式:
std::vector<Building>::size_type getNumberOfBuildings() const
{ return buildings.size(); }
C++11 方式:
auto getNumberOfBuildings() const -> decltype(buildings.size())
{ return buildings.size(); }
C++14 方式:
auto getNumberOfBuildings() const
{ return buildings.size(); }
你应该返回一个std::size_t
。 std::size_t
是使用默认分配器时返回的vector<T>::size()
类型。 vector<T>::size()
返回vector<T>::size_type
,这只是使用默认分配器(您最有可能使用(时std::size_t
的 typedef。
std::vector
提供了一个typedef,std::vector<>::size_type
,指示哪个类型是用作vector::size
结果的类型:
std::vector<TYPE>::size_type getNumberOfBuildings() const { return buildings.size(); }
但是,这通常是size_t
,因此您可以继续直接使用后者:
#include <cstddef>
std::size_t getNumberOfBuildings() const { return buildings.size(); }
正式的答案确实是std::vector<Building>::size_type
的,正如其他答案所述。
真正的答案取决于您的程序中是否已经有一个用于表示建筑物数量的类型。它可能是int
,可能是unsigned
的,也可能是某个typedef名称TBuildingCount
。在这种情况下,您应该使用这种类型。它可能需要强制转换来禁止编译器警告,但通常是这样。
我没有看到你的代码的其余部分,所以我不能肯定地说,但我猜建筑物存储在某个向量中(或任何其他容器(的事实只是一个实现细节,这不应该影响你选择的类型来计算这些建筑物。没有必要公开该包含器的存在(或依赖它(,即使以间接的方式,例如使用其size_type
返回计数。
换句话说,如果您已经决定使用int
来计算建筑物,那么您应该坚持使用问题中的实现。
与许多其他答案相比,函数的返回值实际上更多地取决于您的接口,而不是您在引擎盖下使用的内容。您是否返回了向量的大小并希望每个人都知道它?好吧,然后继续使用std::vector::size_type
.但是你是否真的返回了一些抽象的计数变量,比如建筑物的数量,那么我认为std::vector::size_type
不属于你的接口,因为这只是一个实现细节。
如果它是你返回的东西的大小(但不一定知道是引擎盖下的向量(,我会使用好的旧std::size_t
,但如果它是某物的计数,那么unsigned int
在概念上更合适。当然,没有人能保证一个unsigned int
或std::size_t
可以容纳任意std::vector
的大小,但话又说回来,它不是一个任意的std::vector
,它是一个建筑物的阵列,你自己应该知道是否可以有超过std::numeric_limits<unsigned int>::max()
个建筑物。
- 查找不存在的键时,unordered_map返回什么
- 如果我在 const 函数上使用指针,我可以返回什么?
- 使用枚举作为条件,if 条件将返回什么,真或假?
- 我应该返回什么而不是标准::shared_ptr<>&?
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- 在C++中,运算符 sizeof 返回什么数据类型?
- ActorItr 迭代器变量中有什么,* ActorItr 返回什么?
- mxGetPr 返回什么?
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?
- 范围分辨率运算符在类型:: var的情况下返回什么
- fork_rv返回什么
- int* foo(int a)在C 中返回什么
- 当找不到请求的注册表值时,ReggetValue会返回什么
- 我们应该在带有 char *func(char *string) 的函数中返回什么?需要简要说明这与 c 中的 char
- 重载的 QAbstractItemModel::flags 应该为无效的 QModelIndex 返回什么
- 试图在每次输出后使用一个函数摆脱'0',但不确定我可以返回什么
- 查找函数在失败结果中应该返回什么
- 当c 中的矢量容器过载[]运算符时,我对未定义的索引返回什么
- 新运营商在组装中返回什么