gpt4 book ai didi

c++ - 如何摆脱空指针

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:23 24 4
gpt4 key购买 nike

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

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

此外,还有很多代码处理这些空指针,并使用非常奇怪的 C 构造来模拟 C 中的多态性。

我现在正在修改应用程序,并试图摆脱 void-pointers。向所有数据结构添加一个公共(public)基类并不难(几天的工作),但问题是代码充满了如下所示的结构。

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

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

这是一个如何再次获取数据的例子:

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

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

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

最佳答案

I actually want to replace all the void-pointers with some smart-pointer (reference-counted), but I can't find a trick to automate (or at least) help me to get rid of all the casts to and from void-pointers.

这种自动重构会带来很多风险。

否则,有时我喜欢把这样的 void* 函数做成模板函数来耍花样。那:

void storeData (int datatype, void *data);

变成:

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

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

关于c++ - 如何摆脱空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com