我有类A_class
,我需要一个指向这个类的对象的指针向量。是否有充分的理由选择其中一种用法:cpp有没有理由更喜欢矢量<class_type*>到矢量<void*>?
vector<void*> my_vector;
vector<A_class*> my_vector;
真的有区别吗?
编辑: 让我改一下 - 是在存在方式的差异实际数组存储?我不是在问安全问题,而是在于表现。
我有类A_class
,我需要一个指向这个类的对象的指针向量。是否有充分的理由选择其中一种用法:cpp有没有理由更喜欢矢量<class_type*>到矢量<void*>?
vector<void*> my_vector;
vector<A_class*> my_vector;
真的有区别吗?
编辑: 让我改一下 - 是在存在方式的差异实际数组存储?我不是在问安全问题,而是在于表现。
你应该记住,一个空指针不能直接取消引用。你最终必须将它转换为你的班级。因此,如果没有任何充足的理由去寻找一个void指针,并且你确定该vector必须存储指向A_class对象的指针,那么我宁愿避免使用void指针。
void指针的一个很好的原因正如你所描述的:你不想(可以)对它进行解引用。当你传递一些你最终传回指针的'用户数据'指针时,这很常见。你想把它当作一个不透明的标志来对待。 –
@FrerichRaabe:但是你也可以通过只向前声明它引用的struct /类来做到这一点,避免有人错误地将一些随机指针传递给你的函数。换句话说'class filehandle; filehandle * fileopen(const std :: string&filename); void close(filehandle *);' –
@MatsPetersson:我正在考虑一个通过用户数据指针的情况,你不知道它指向什么,而你不想*知道它指向什么。考虑线程创建函数的'void *'参数。你只是通过了一些指针,你应该稍后把它交给客户端。 –
使用void *
应尽可能避免。
这是出于两个原因:
void *
转换回原始类型。C++中很少有案例(感谢模板),其中void *
实际上是有意义的。我确信有一些,但现在我不能真正想到任何情况(除了需要将其用于历史/兼容性原因时,例如,将指向类的指针转换为“C”代码,它在何处不理解class
的概念,所以你不能给它正确的类型)。
你不能做了一大堆与void*
除非你投了,所以真的没有优势,使用它在实际的类型。
即使唯一的原因是为了避免不必要的演员阵容,这将是足够的。这不是。您可能会将void*
转换为任何内容并错误地使用结果。使用真实的类本身还具有代码更清晰的额外好处。
是真的有区别吗?
一个vector<void*>
也将接受int*
类型,YourClassHere**
和任何其他指针,你可以想像的价值。这是不安全的,所以除非你有一个很好的理由来使用它(我想不出多少) - 不要。
为什么你甚至认为它是一种替代方案?
它还需要您明确地将指针转回A_class*
,只要您使用它们(这很丑陋,冗长且容易出错)。
您选择
vector<*void> my_vector;
,如果你不知道什么类型的将被存储在my_vector
对象。如果你知道他们会A_class
类型,然后使用
vector<A_class*> my_vector;
你的意思是,除了让编译器完成其工作(类型检查)? –
'vector <*void>'没有意义。你的意思是'矢量'? –
aschepler
除了使用类指针更快更安全的事实吗?没有,根本没有 – user1233963