簡體   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