【问题标题】:What can I do instead of this that's better, for my smart pointers?对于我的智能指针,我能做些什么而不是更好?
【发布时间】:2021-07-06 13:22:51
【问题描述】:

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

// 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() 函数,否则它为什么不能工作,没有它我如何将对象传递给函数?

【问题讨论】:

  • 也许你想要的是类型转换重载? learncpp.com/cpp-tutorial/overloading-typecasts
  • 我认为这是不好的做法有很多原因,首先是标准库中已经存在std::unique_ptrstd::shared_ptrstd::weak_ptr。你也公然违反了 5 规则。
  • T* self() { return pointer; } 将是您想要的,在您的指针类中。您想公开 指针,而不是您的对象。在std::unique_ptr 中,这是.get() 函数。
  • “我知道这行得通”。 Doesn't look like it.
  • NULL 代替 nullptr 将是另一个不太明显的事情,你最好避免。但这当然没有实际意义,您是否应该使用标准指针类型而不是自己编写一个。标准std::unique_ptr 的效率与编写此类类型的效率差不多。

标签: c++ function pointers operator-overloading smart-pointers


【解决方案1】:

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

template<typename T>
class ptr {
...

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

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

【讨论】:

    【解决方案2】:

    可以从ptr&lt;Foo&gt; fo Foo* 自动转换:

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

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

        T* get() { return pointer; }
    

    这样的转换是明确的。

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

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 2020-03-16
      • 2021-09-28
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多