在c ++中重载间接运算符[重复]
Posted
技术标签:
【中文标题】在c ++中重载间接运算符[重复]【英文标题】:Overloading the indirection operator in c++ [duplicate] 【发布时间】:2012-02-09 02:08:54 【问题描述】:我的问题很简单。我有一个类模板,其中包含一个指向动态分配类型的指针。我想重载间接运算符,以便使用 -> 运算符引用类模板实例,就像我直接使用包含在其中的指针一样重定向。
template<class T>
class MyClass
T *ptr;
...
// created dynamic resource for ptr in the constructor
;
创建某种类型的 myclass:
MyClass<SomeObject> instance;
所以我想要的是不用输入:
instance.ptr->someMemberMethod();
我只需输入:
intance->someMemberMethod();
即使你 instance
不是指针,它的行为就好像它是 instance
包含的指针一样。如何通过重载运算符来弥补这一差距?
【问题讨论】:
Modern C++ Design (Andrei Alexandrescu) 有一些关于这个主题的非常好的信息,如果你想更深入的话。 【参考方案1】:你可以重载operator->
和operator*
:
template<class T>
class MyClass
T* ptr;
public:
T* operator->()
return ptr;
// const version, returns a pointer-to-const instead of just a pointer to
// enforce the idea of the logical constness of this object
const T* operator->() const
return ptr;
T& operator*()
return *ptr;
// const version, returns a const reference instead of just a reference
// to enforce the idea of the logical constness of this object
const T& operator*() const
return *ptr;
;
请注意,由于语言创建者的设计决定,您不能重载 .
运算符。
另外,您可能认为operator*
会重载乘法 运算符而不是取消引用运算符。然而,情况并非如此,因为乘法运算符接受一个参数(而取消引用运算符不接受任何参数),因此编译器可以分辨出哪个是哪个。
最后,请注意operator->
返回一个指针,而operator*
返回一个引用。很容易不小心把他们弄糊涂了。
【讨论】:
不错的答案。但是你能说出 const-version 和 non-const version 之间的区别吗?我什么时候使用它们中的任何一个? 还有为什么需要重载->
和*
。为什么只是重载->
还不够?
@SimpleGuy 您班级的用户通常期望foo->bar
等同于(*foo).bar
。让他们与众不同会让很多人感到震惊。
@Bernard Oh.. 从这个角度来看,这样做很好..【参考方案2】:
可以重载成员访问操作符,返回一个指向要访问的对象的指针:
T * operator->() return ptr;
T const * operator->() const return ptr;
您可能还需要尊重操作符,让它感觉更像是一个指针;这将返回一个引用:
T & operator*() return *ptr;
T const & operator*() const return *ptr;
【讨论】:
【参考方案3】:重载->
运算符:
template <typename T> class MyClass
T * p;
public:
T * operator->() return p; // #1
T const * operator->() const return p;
;
请注意,两个重载都不会改变对象;尽管如此,我们还是决定将#1 设为非常量,以便我们将对象的 const 性遗赠给指针对象。这有时被称为“深度常量传播”或类似的东西。语言 D 更进一步。
【讨论】:
“我们决定让#1 非常量”——至少,如果我们愿意,我们可以。标准智能指针不会,本质上与可以通过T *const
修改T
类型的对象相同的原因。你做什么取决于instance
是否“逻辑上”是对另一个对象的间接引用(在这种情况下模仿标准智能指针)或不是(在这种情况下诅咒Bjarne你不能重载operator.
)。
@SteveJessop:我想,“我们”就像“你和我,在这个进入 C++ 的旅程中”,而不是“我们是所有意见的现存统治者”。对不起,旧习惯 :-)以上是关于在c ++中重载间接运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章