在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-&gt;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-&gt; 返回一个指针,而operator* 返回一个引用。很容易不小心把他们弄糊涂了。

【讨论】:

不错的答案。但是你能说出 const-version 和 non-const version 之间的区别吗?我什么时候使用它们中的任何一个? 还有为什么需要重载-&gt;*。为什么只是重载-&gt; 还不够? @SimpleGuy 您班级的用户通常期望foo-&gt;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】:

重载-&gt; 运算符:

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 ++中重载间接运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++中重载赋值运算符的返回类型[重复]

在 C++ 中重载运算符 < [重复]

在 C 中使用 ?: 运算符的复合 if 语句 [重复]

在cpp中重载<<运算符的正确方法是啥[重复]

php重载=运算符[重复]

如果条件在c ++和python中执行运算符[重复]