如何摆脱空虚
我继承了一个最初用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