我继承了原文为C(但在平均时间很多C ++的也加入其中)一个大的应用程序。由于历史的原因,应用程序包含了很多空隙的指针。在您开始呛,让我解释为什么这样做的目的。

该应用程序包含许多不同的数据结构,但它们被存储在“通用”的容器。现在我会用模板STL容器,或者我会给所有的数据结构一个共同的基类,使容器能够指针存储基类,但在[好?]旧的C天,唯一的解决办法是该结构-指针转换为一个空隙的指针。

此外,还有大量的代码,它使用非常奇怪Ç构造以模拟多态性在这些空隙的指针作品,并用C

我现在再加工中的应用,并试图摆脱空洞的指针。添加一个共同的基级给所有的数据结构并不难(工作的几天),但问题是该代码是全构造的像显示在下面。

这是的数据是如何被存储的示例:

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

这是如何数据的一个例子被重新获取:

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

其实我是想取代所有的空隙指针与一些智能指针(引用计数),但我不能找到一个窍门自动化(或至少)帮我摆脱所有铸件中并从空隙的指针。

如何查找,替换,或任何提示,在这些转换任何可能的方式进行交互?

有帮助吗?

解决方案 3

显然,没有自动化的方式/特技转换或发现空隙的指针的所有用途。我将不得不使用手工劳动来找到所有空隙的指针,在PC - 皮棉的组合,这将使错误每当有不正确的转换。

结案。

其他提示

  

其实我是想全部更换   空指针与一些智能指针   (引用计数),但我无法找到   一招自动化(或至少)帮助   我摆脱所有的强制类型和   从空隙的指针。

这样的自动重构承担许多风险。

另外,有时候我喜欢通过制作这种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不共享相同的指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top