【问题标题】:How can I define a function that takes as a parameter a pointer value of any kind?如何定义一个将任何类型的指针值作为参数的函数?
【发布时间】:2014-12-03 17:45:09
【问题描述】:

我正在实现一个智能指针类。

我已经定义了一个赋值运算符重载,它采用同一类的另一个实例。现在我想定义这个运算符的重载,它接受任何指针。所以我应该可以做smartPointer = &someObject;smartPointer = NULL;之类的事情。

我该怎么做呢?我应该传入void* 吗?还有什么?

作为一个更普遍的问题(我知道这很少需要):什么样的参数告诉编译器可以传入任何指针?

【问题讨论】:

  • 在实践中,您可能不希望这样。因为这意味着您可以轻松地做到smartPointer1 = rawPointer; smartPointer2 = rawPointer; - 现在,谁删除了记忆?
  • 您可以使用模板方法:template <typename T> MySmartPointer& MySmartPointer::operator =(T* p);
  • @Jarod42 我想过,但我认为这不是我想要的,因为这意味着如果客户端执行smart_pointer = raw_pointer,则传入的参数将是指向该指针的指针。我错了吗?
  • @AvivCohn:要获得指向指针的指针,客户端将使用smart_pointer = &raw_pointer
  • @Jarod42 等一下:(T* p) 的意思是“T 必须是指针类型”吗?

标签: c++ pointers assignment-operator


【解决方案1】:

以下可能会有所帮助:

class MySharedPointer
{
public:

    template <typename T>
    MySharedPointer& operator = (T* p)
    {
        ptr.reset(p, [](void* p) { delete static_cast<T*>(p); });
        return *this;
    }

    // nullptr is not a pointer, so it should have its own overload.
    MySharedPointer& operator = (std::nullptr_t) {
        ptr.reset();
        return *this;
    }

private:
    std::shared_ptr<void> ptr;
};

Live example

【讨论】:

    【解决方案2】:

    您可以使用模板函数使您的对象允许将任何指针分配给它。

    template<typename T>
    void operator=(T* obj)
    {
        //Your code here
    }
    

    但是,如果您可以为其分配任何原始指针,它就不是智能指针,因为它可以分配给多个智能指针对象,然后在删除指针时会出现问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多