C++ cpp是否有理由选择vector<;类别_类型*>;到向量<;无效*>;?
我有一个classC++ cpp是否有理由选择vector<;类别_类型*>;到向量<;无效*>;?,c++,pointers,vector,C++,Pointers,Vector,我有一个classA_class,我需要一个指向此类对象的指针向量。是否有充分的理由选择以下任一用法: vector<void*> my_vector; vector<A_class*> my_vector; vector my_vector; 向量my_向量; 真的有区别吗 编辑: 让我换一句话——实际数组的存储方式是否存在差异?我问的不是安全问题,而是性能问题。您应该记住,无效指针不能直接取消引用。你最终必须把它输入到你的班级 因此,如果没有任何好的理由使用voi
A_class
,我需要一个指向此类对象的指针向量。是否有充分的理由选择以下任一用法:
vector<void*> my_vector;
vector<A_class*> my_vector;
vector my_vector;
向量my_向量;
真的有区别吗
编辑:
让我换一句话——实际数组的存储方式是否存在差异?我问的不是安全问题,而是性能问题。您应该记住,无效指针不能直接取消引用。你最终必须把它输入到你的班级
因此,如果没有任何好的理由使用void指针,并且您确信向量将存储指向类对象的指针,那么我更愿意避免使用void指针。应尽可能避免使用
void*
这有两个原因:
void*
转换回原始类型李>
在C++中(很少有模板),其中代码>虚空*/COD>实际上是有意义的。我肯定有一些,但我现在真的想不出任何情况(除了出于历史/兼容性原因需要使用它时,例如,将指向类的指针转移到“C”代码,其中它不理解
类的概念,因此无法为其提供正确的类型) 除非对其进行强制转换,否则无法使用void*
执行大量操作,因此使用它与实际类型相比没有任何优势
即使唯一的原因是避免不必要的演员阵容,那也足够了。但事实并非如此。您可能会将void*
强制转换为任何内容,并错误地使用结果。使用真实类本身还有一个额外的好处,即代码更清晰
真的有区别吗
vector
还可以接受类型为int*
、yourclassehere**
的值以及您可以想象的任何其他指针。它是不安全的,所以除非你有很好的理由使用它(我想不出很多),否则不要
为什么你甚至认为这是另一种选择?
它还要求您在使用指针时显式地将指针转换回A_类*
(这很难看、冗长且容易出错)。您选择了
vector<*void> my_vector;
你的意思是,除了允许编译器执行其工作(类型检查)之外,vector
没有意义。除了使用类指针更快、更安全之外,你是说vector
?不,一点也不“cpp是否有理由更喜欢vector
而不是vector
?”-当然,安全性。@H2CO3既不编译,所以它们都非常安全:)空指针的一个很好的理由正是您所描述的:您不想(能够)取消引用它。当您被传递一些“用户数据”指针时,这是很常见的,您最终会将这些指针传递回该指针。您希望将其视为不透明的标记。@FrerichRaabe:但您也可以这样做,只需向前声明它所引用的结构/类,避免有人错误地向您的函数传递一些随机指针。换句话说,类文件句柄;filehandle*fileopen(const std::string和filename);作废关闭(文件句柄*)代码>@Matstpeterson:我在想一个例子,当你通过一个用户数据指针时,你不知道它指向什么,你也不想知道它指向什么。考虑线程创建函数的'void*'参数。你只需要传递一些指针,你应该稍后把它交还给客户端。线程上下文中的void*
是C时代的倒退,那时它是传递任意参数的唯一方法。在C++中,可以用模板来实现。@ FrReCiRababe,在 C++ <代码>设置中,您的参数是有意义的,但在 C++ +<代码>中没有。用户未知对象的不透明句柄在C++
中不是一种合理的设计。相反,您在类实现中隐藏了设计细节,但使接口完全透明。
vector<A_class*> my_vector;