【发布时间】: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_ptr和std::shared_ptr和std::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