如何摆脱空虚

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

该应用程序包含许多不同的数据结构,但它们存储在“通用”容器中。 现在我会为它使用模板化的STL容器,或者我会为所有数据结构提供一个通用的基类,以便容器可以存储指向基类的指针,但是在[良好]旧C日,唯一的解决方案是将结构指针转换为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 storeData (int datatype, void *data);

变为:

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

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


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

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

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

当然,这里假定你不希望在调用存储/获取时共享同一个指针。 换句话说,myCustomer1和myCustomer2不共享相同的指针。


显然,没有自动化的方法/技巧来转换或查找void指针的所有用法。 我将不得不使用体力劳动来查找所有无效指针,与PC-Lint结合使用,只要出现不正确的转换,就会发生错误。

案件结案。

链接地址: http://www.djcxy.com/p/7615.html

上一篇: How to get rid of void

下一篇: Custom error handling in DNN 7?