-2

我有 class A_class,我需要一个指向此类对象的指针向量。是否有充分的理由偏爱以下两种用法:

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

真的有区别吗?

编辑:让我换个说法 - 实际数组的存储方式有什么不同吗?我问的不是安全,而是性能。

4

5 回答 5

4

void *应尽可能避免使用。

这有两个原因:

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

在 C++ 中(多亏了模板)很少有void *真正有意义的情况。我确定有一些,但我现在真的想不出任何情况(除了出于历史/兼容性原因需要使用它时,例如将指向类的指针转移到“C”代码,它在哪里不理解 的概念class,所以不能给它正确的类型)。

于 2013-08-27T10:49:18.080 回答
2

除非您强制转换它,否则您无法做很多void*事情,因此使用它与实际类型相比实际上没有任何优势。

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

于 2013-08-27T10:49:31.127 回答
2

真的有区别吗?

Avector<void*>还将接受 type 的值int*YourClassHere**以及您可以想象的任何其他指针。这是不安全的,所以除非你有充分的理由使用它(我想不出很多)——不要。

为什么您甚至将其视为替代方案?

它还要求您A_class*在使用它们时显式地将指针转换回它们(这很丑陋、冗长且容易出错)。

于 2013-08-27T10:50:39.360 回答
1

您应该记住,不能直接取消引用 void 指针。您最终必须将其类型转换为您的班级。

因此,如果没有任何充分的理由使用 void 指针,并且您确定该向量应存储指向 A_class 对象的指针,那么我宁愿避免使用 void 指针。

于 2013-08-27T10:49:14.017 回答
0

你选择了

vector<*void> my_vector; 

如果您不知道将存储什么类型的对象my_vector。如果您知道它们将是类型,请A_class使用

vector<A_class*> my_vector; 

使用空指针

于 2013-08-27T10:53:29.523 回答