【问题标题】:How to get rid of void-pointers如何摆脱空指针
【发布时间】:2011-03-02 20:32:47
【问题描述】:

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

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

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

我现在正在重新设计应用程序,并试图摆脱空指针。为所有数据结构添加一个通用基类并不难(几天的工作),但问题是代码中充满了如下所示的结构。

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

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

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

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

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

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

【问题讨论】:

  • 我真的相信自动执行此操作没有任何技巧。一个接一个...
  • store 和 fetch 函数对 'datatype' 有什么作用?他们是在做结构的盲拷贝还是只是存储那个 void 指针?
  • 数据类型用于将相同数据类型的所有数据存储在一起,并对数据类型执行一些“通用”逻辑。如前所述,它模拟了普通 C 中的多态性。

标签: c++ c casting void-pointers


【解决方案1】:

我实际上想替换所有 带有一些智能指针的空指针 (参考计数),但我找不到 自动化(或至少)帮助的技巧 我摆脱所有演员表和 来自空指针。

这种自动化重构存在许多风险。

否则,有时我喜欢通过将此类 void* 函数制作为模板函数来耍花招。那:

void storeData (int datatype, void *data);

变成:

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

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

【讨论】:

    【解决方案2】:

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

    storeData(TYPE_CUSTOMER, myCustomer1->get());
    
    shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???");
    

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

    【讨论】:

      【解决方案3】:

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

      结案。

      【讨论】:

        猜你喜欢
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多