C++ cpp是否有理由选择vector<;类别_类型*>;到向量<;无效*>;?

C++ cpp是否有理由选择vector<;类别_类型*>;到向量<;无效*>;?,c++,pointers,vector,C++,Pointers,Vector,我有一个classA_class,我需要一个指向此类对象的指针向量。是否有充分的理由选择以下任一用法: vector<void*> my_vector; vector<A_class*> my_vector; vector my_vector; 向量my_向量; 真的有区别吗 编辑: 让我换一句话——实际数组的存储方式是否存在差异?我问的不是安全问题,而是性能问题。您应该记住,无效指针不能直接取消引用。你最终必须把它输入到你的班级 因此,如果没有任何好的理由使用voi

我有一个class
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;