如何摆脱虚空指针

时间:2010-06-11 20:55:38

标签: c++ c casting void-pointers

我继承了一个最初用C语言编写的大型应用程序(但同时也添加了很多C ++)。由于历史原因,该应用程序包含许多void指针。在你开始窒息之前,让我解释一下为什么要这样做。

应用程序包含许多不同的数据结构,但它们存储在“通用”容器中。现在我会使用模板化STL容器,或者我会给所有数据结构一个公共基类,这样容器可以存储指向基类的指针,但是在[好?]旧C天,唯一的解决方案是将struct-pointer转换为void-pointer。

此外,有很多代码适用于这些void指针,并使用非常奇怪的C结构来模拟C中的多态性。

我正在重新编写应用程序,并试图摆脱虚空指针。为所有数据结构添加一个公共基类并不是那么难(几天的工作),但问题是代码中充满了如下所示的结构。

这是数据存储方式的示例:

void storeData (int datatype, void *data);    // function prototype
...
Customer *myCustomer = ...;
storeData (TYPE_CUSTOMER, myCustomer);

这是如何再次获取数据的示例:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);

我实际上想用一些智能指针(引用计数)替换所有的void指针,但是我找不到自动化(或者至少)帮助我摆脱所有强制转换的技巧。来自void-pointers。

有关如何以任何可能的方式查找,替换或与这些转化进行互动的任何提示?

3 个答案:

答案 0 :(得分:7)

  

我其实想要更换所有的   带有一些智能指针的void-pointers   (参考计数),但我找不到   自动化(或至少)帮助的技巧   我要摆脱所有演员阵容   来自void-pointers。

这种自动重构存在很多风险。

否则,有时我喜欢通过制作模板函数的void *函数来玩弄技巧。即:

void storeData (int datatype, void *data);

变为:

template <class T>
void storeData (int datatype, T *data);

首先通过简单地包装原始(重命名)函数并转换类型来实现模板。这可能会让您看到潜在的问题 - 只需编译代码即可。

答案 1 :(得分:0)

您可能不需要摆脱强制转换以使用共享指针。

storeData(TYPE_CUSTOMER, myCustomer1->get());

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???");

当然,这假设您不希望在存储/获取调用之间共享相同的指针。换句话说,myCustomer1和myCustomer2不共享相同的指针。

答案 2 :(得分:0)

显然,没有自动的方法/技巧来转换或找到void-pointers的所有用法。我将不得不使用手工劳动来找到所有的void指针,结合PC-Lint,只要转换不正确就会出错。

案件结案。