2016-07-28 34 views
0

我寫指針使用 (我需要智能指針,但我不能使用升壓或C++ 11)這個模板類:C++:與超載箭頭指針模板的使用( - >)運算符

template<class T> 
class TreePointer{ 
public: 
    TreePointer(){ 
     isRefOnly=false; 
     data=NULL; 
    }; 
    TreePointer(T* data){ 
     this->data=data; 
     this->isRefOnly=false; 
    } 
    TreePointer(const TreePointer& anotherPtr){ 
     this->data=anotherPtr.data; 
     this->isRefOnly=true; 
    } 
    virtual ~TreePointer(){ 
     if (!isRefOnly){       
      delete data; 
     }   
    }  
    T* operator->() const{ 
     return data; 
    } 
    void operator=(const TreePointer &anotherPtr){ 
     this->data=anotherPtr.data; 
     this->isRefOnly=true; 
    }   
private: 
    T* data; 
    bool isRefOnly; 
}; 

而且我有很大的類方法很多,像這樣:

class WrittenBigClassWithManyMethods{ 
public: 
    WrittenBigClassWithManyMethods(int v){ 
     this->v=v; 
    }  
    int sum(WrittenBigClassWithManyMethods* a){ 
     return v+a->v; 
    } 
    int v; 
}; 

我的智能指針的這種用法很好地工作:

TreePointer<WrittenBigClassWithManyMethods> tp(new WrittenBigClassWithManyMethods(5)); 
WrittenBigClassWithManyMethods* simpleClass=new WrittenBigClassWithManyMethods(5); 
cout << tp->sum(simpleClass); 

但它的使用是不行的:

TreePointer<WrittenBigClassWithManyMethods> tp2(new WrittenBigClassWithManyMethods(5)); 
cout << tp->sum(tp2); 

如何我可以改變我的模板爲指針,使調用methrod WrittenBigClassWithManyMethods的總和TreePointer類型的參數,而無需任何同類的變化WrittenBigClassWithManyMethods及其任何用法?如果這不可行,我如何最小化類的變更WrittenBigClassWithManyMethods及其用法?

+0

'TreePointer p = makeThingy();'可能不會表現出你想要的樣子。這不是一個智能指針,它是unique_ptr和raw指針的混合,取決於布爾狀態。相反,只需使用unique_ptr和T&。 –

+0

或者只使用'std :: auto_ptr',而不是C++ 11。 –

回答

2

通常情況下,您也希望超載一元運算符*(取消引用),並返回T&。然後,你可以通過取結果的地址都引用和原指針:

tp1->method_that_takes_ref(*tp2); // With operator*() 
tp1->method_that_takes_ptr(&*tp2); // Works, but syntax might be a bit surprising 

另一種方式來獲得在裏面的指針會直接調用operator ->,但是這將是一個有點尷尬。你很可能會更好提供某種形式的「get」方法,就像一個在的unique_ptr,這只是返回原始指針:

tp1->method_that_takes_ptr(tp2.operator->()); // Works, but ugh 
tp1->method_that_takes_ptr(tp2.get()); // Much clearer 
1

新增轉換,運營商T*

operator T*() { 
    return data; 
} 

現在編譯器會在它想要將TreePointer<SomeClass>轉換爲SomeClass*時調用它。

+0

這個解決方案的問題在於,藉助於隱式轉換,它允許您直接在智能指針對象上使用指針算術,這在上下文中通常沒有意義。這就是爲什麼unique_ptr不提供這樣的操作符,而是提供了一個「get」成員函數。 –