如何摆脱虚空指针

Pat*_*ick 6 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);
Run Code Online (Sandbox Code Playgroud)

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

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);
Run Code Online (Sandbox Code Playgroud)

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

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

Dum*_*001 7

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

这种自动重构具有很多风险.

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

void storeData (int datatype, void *data);
Run Code Online (Sandbox Code Playgroud)

变为:

template <class T>
void storeData (int datatype, T *data);
Run Code Online (Sandbox Code Playgroud)

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


Pat*_*ick 0

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

案件结案。