2013-08-27 49 views
-2

我有类A_class,我需要一个指向这个类的对象的指针向量。是否有充分的理由选择其中一种用法:cpp有没有理由更喜欢矢量<class_type*>到矢量<void*>?

vector<void*> my_vector; 
vector<A_class*> my_vector; 

真的有区别吗?

编辑: 让我改一下 - 是在存在方式的差异实际数组存储?我不是在问安全问题,而是在于表现。

+0

你的意思是,除了让编译器完成其工作(类型检查)? –

+1

'vector <*void>'没有意义。你的意思是'矢量'? – aschepler

+0

除了使用类指针更快更安全的事实吗?没有,根本没有 – user1233963

回答

1

你应该记住,一个空指针不能直接取消引用。你最终必须将它转换为你的班级。因此,如果没有任何充足的理由去寻找一个void指针,并且你确定该vector必须存储指向A_class对象的指针,那么我宁愿避免使用void指针。

+1

void指针的一个很好的原因正如你所描述的:你不想(可以)对它进行解引用。当你传递一些你最终传回指针的'用户数据'指针时,这很常见。你想把它当作一个不透明的标志来对待。 –

+0

@FrerichRaabe:但是你也可以通过只向前声明它引用的struct /类来做到这一点,避免有人错误地将一些随机指针传递给你的函数。换句话说'class filehandle; filehandle * fileopen(const std :: string&filename); void close(filehandle *);' –

+1

@MatsPetersson:我正在考虑一个通过用户数据指针的情况,你不知道它指向什么,而你不想*知道它指向什么。考虑线程创建函数的'void *'参数。你只是通过了一些指针,你应该稍后把它交给客户端。 –

4

使用void *应尽可能避免。

这是出于两个原因:

  1. 你失去对象的类型。
  2. 代码变得更加混乱,因为您必须将void *转换回原始类型。

C++中很少有案例(感谢模板),其中void *实际上是有意义的。我确信有一些,但现在我不能真正想到任何情况(除了需要将其用于历史/兼容性原因时,例如,将指向类的指针转换为“C”代码,它在何处不理解class的概念,所以你不能给它正确的类型)。

2

你不能做了一大堆与void*除非你投了,所以真的没有优势,使用它在实际的类型。

即使唯一的原因是为了避免不必要的演员阵容,这将是足够的。这不是。您可能会将void*转换为任何内容并错误地使用结果。使用真实的类本身还具有代码更清晰的额外好处。

2

是真的有区别吗?

一个vector<void*>也将接受int*类型,YourClassHere**和任何其他指针,你可以想像的价值。这是不安全的,所以除非你有一个很好的理由来使用它(我想不出多少) - 不要。

为什么你甚至认为它是一种替代方案?

它还需要您明确地将指针转回A_class*,只要您使用它们(这很丑陋,冗长且容易出错)。

0

您选择

vector<*void> my_vector; 

,如果你不知道什么类型的将被存储在my_vector对象。如果你知道他们会A_class类型,然后使用

vector<A_class*> my_vector; 

using void pointers