繁体   English   中英

对于我的智能指针,我能做些什么而不是更好?

[英]What can I do instead of this that's better, for my smart pointers?

问题问什么。 我知道这行得通,但这是好的做法还是坏的做法? 另一个我看到有人用的例子,我自己也一直在用,但感觉不对。

// in some header file

template <class T>
class ptr {
private:
    T* pointer;
public:
    explicit ptr (T* p = NULL) : pointer(p) { }
    ~ptr()                                  { delete (pointer); }
    T& operator *()                         { return *pointer; }
    T* operator ->()                        { return pointer; }
};
// in some source file, probably main.cpp
ptr<Foo> foo(new Foo());

function(foo->self()); // using function(foo) doesn't work because it can't
                       // convert ptr<Foo> to Foo*
// somewhere inside definition of Foo
Foo* self() { return this; }

除非我包含self() function,否则为什么它不起作用,如果没有它,我如何将 object 传递给 function?

你必须制作一个指针类型的getter。

template<typename T>
class ptr {
...

  const T* get() const { return pointer; }
  T* get() { return pointer; }
}

function(foo->get());
  • 避免使用new . 创建一个制造商 function 像std::make_uniquestd::make_shared
  • 创建复制/移动构造函数/赋值运算符。 对每个操作做出正确的行为。
  • 添加 const 访问器

可以从ptr<Foo> fo Foo*自动转换:

template <class T>
class ptr {
    private:
        T* pointer;
    public:
        operator T*() { return pointer; }
    // rest of code

但是拥有它会破坏智能指针的想法,因此标准库中的智能指针类不包含它。 相反,他们有类似的东西

    T* get() { return pointer; }

所以这样的转换是明确的。

大多数时候,您应该只使用标准库类之一。 如果您需要创建自己的智能指针,建议避免包含operator T*() (并且通常避免自动转换)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM