Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我真的需要返回Type::size\u Type吗?_C++_Types_Size Type - Fatal编程技术网

C++ 我真的需要返回Type::size\u Type吗?

C++ 我真的需要返回Type::size\u Type吗?,c++,types,size-type,C++,Types,Size Type,我经常有一些类,它们大多只是一些STL容器的包装,如下所示: class Foo { public: typedef std::vector<whatever> Vec; typedef Vec::size_type size_type; const Vec& GetVec() { return vec_; } size_type size() { return vec_.size() } private: Vec vec_; }; class-Foo{

我经常有一些类,它们大多只是一些STL容器的包装,如下所示:

class Foo {
public:
  typedef std::vector<whatever> Vec;
  typedef Vec::size_type size_type;
  const Vec& GetVec() { return vec_; }
  size_type size() { return vec_.size() }
private:
  Vec vec_;
};
class-Foo{
公众:
typedef std::向量向量;
typedef-Vec::size\u-type size\u-type;
const-Vec&GetVec(){return-Vec}
大小\类型大小(){return vec\类型大小()}
私人:
Vec-Vec;
};

我不太确定是否返回
size\u type
。通常,一些函数会调用
size()
并将该值传递给另一个函数,该函数将使用该值,并且可能会传递该值。现在每个人都必须包含Foo头,尽管我实际上只是传递一些大小值,它应该是
unsigned int
无论如何。。。?在这里应该做什么?在任何地方都使用
size\u type
是最佳做法吗?

实际上,为了64位兼容性,它应该是size\u t而不是unsigned int。作为包装类编写器,我将返回size\u类型。作为类客户端,如果比较方便的话,我会把它转换成适当的类型(siZeHT)。

可以考虑的一个选项是继承< <代码> STD::vector < /代码>:

typedef std::vector<whatever> Foo_Vec;

class Foo : public Foo_Vec
{
public:
    const Foo_Vec &GetVec() { return (Foo_Vec&)*this; }
};
typedef std::vector Foo_Vec;
Foo类:公共Foo_Vec
{
公众:
const Foo_Vec&GetVec(){return(Foo_Vec&)*this;}
};
我并不是说这是最好的方法,因为它可能会引入一些问题,这些问题不会因为拥有一个私有成员或继承
private Foo\u Vec
而发生,因为
public Foo\u Vec
std::vector
上的所有方法公开给
Foo
。而且,
std::vector
没有虚拟析构函数,因此如果您试图用一个Foo清理
std::vector
的集合,它将不会被完全清理。我只是把它扔出去


正如其他答案所建议的,您应该使用
size\u t
size\u type
而不是
unsigned int
,以实现64位兼容性。否则,在未来的64位构建中,
std::vector
可能包含超过232项,但大小值将被截断,从而导致错误。

STL将这些类型定义为容器的抽象接口。它旨在支持任何类型的备份存储。这可能是NUMA或磁盘备份存储,其中
size\u类型
ptr类型
与系统内存不同。或者-在NUMA体系结构中-它可能是一个特定的内存节点,速度很快,可以使用非常小的
size\u类型
ptr\u类型
-这是许多体系结构上的相关优化

至少,这是设计目标,也由预期驱动,哪些是支持C++的平台。一些早期的让步还允许STL实现者使用快捷方式,基本上禁用了这种灵活性,我从未使用过利用这种灵活性的STL实现。我会说这是因为线性内存访问已经不再是一个问题,而STL在这个级别上的开发实际上并不容易

但是,它对你有多大的伤害?这将是正确的做法。

它应该是
vector::size\u type
就像您所拥有的那样,这是最正确的方法

也就是说,我知道很多人,包括我自己,只会使用
size\u t
。虽然没有强制要求相同,
vector::size\u type
对于我所知道的每个实现都是
size\t
。你应该不会介意的

我不太确定是否会回来 大小和类型。通常,某些功能会 调用size()并将该值传递给 另一个函数和一个将使用的函数 然后可能会把它传下去。现在大家 必须包括Foo头

返回
size\u-type
是可以的,但这并不意味着另一个函数必须采用与类中定义的typedeff相同的
size\u-type
。整数类型之间存在转换。勇敢地使用
size\u t


无论如何,您不能重载函数,这样就有一个函数可以处理向量的
大小,另一个函数可以处理deque的大小等,以防它们都使用不同的
大小类型(标准可能允许)。-但是,如果可能的话,您也可以使用模板从参数中推断出要使用的正确的
size\u类型。

有问题,请参见,例如,因为std::vector没有虚拟析构函数。您永远不应该从标准库继承,除非它是专门标记为标准库的类-1.我们是否可以在C++中发现另一种“病毒”:
Container::size\u type
,它必须通过抽象的每一层传播?:)“经常”在一些STL容器周围有一些仅仅是包装器的类,这让我觉得是一种代码味道。如果您更好地利用STL的算法和其他功能,您可能不需要包装容器来获得所需的行为。嗯,我倾向于编写包装类,而不仅仅是使用
typedef
,因为我可能希望在某个时候添加功能。但这是真的,通常我也可以只
typedef
,如果真的有必要,以后再重构。@dehmann:嗯,功能可以作为自由函数添加,这是首选。+1:不是真正的可移植或兼容,但我也做同样的事情。