C++ 从类中调用重载运算符

Posted

技术标签:

【中文标题】C++ 从类中调用重载运算符【英文标题】:C++ Calling overloaded operator from within a class 【发布时间】:2016-06-19 10:58:02 【问题描述】:

我有一个继承自另一个类的类,我希望调用 [index] 来访问某个已分配存储的第 index 个元素。

这是一个最小的例子:

class A

    protected:
    double *mem;

    double operator[](const size_t index)
    
        return mem[index];
    


class B : public A

    void function()
    
        double var = this->operator[](0);
    

所以在这里我通过调用this->operator[](0) 来解决这个问题,这有点混乱。

考虑到我无法从派生类访问该变量,这是访问mem 元素的正确方法,还是有其他方法?

编辑:我认为我符合 C++11 可能很重要,所以不能调用mem[0]

编辑,模板类

如下所述,我看到的编译器错误在这个示例中没有出现,因为这里没有模板。

重现编译器错误:

template <typename T>
class A

    protected:
    double *mem;

    double operator[](const size_t index)
    
        return mem[index];
    


template <typename T>
class B : public A<T>

    void function()
    
        double var = this->operator[](0);
    

可能的解决方案

return this->operator[](0);
return (*this)[0];
return (this->mem)[0];
return *((this->mem)+0);
return (*this).mem[0];
return *((*this).mem+0);

...我认为所有这些都符合我的期望。还有什么建议吗?

更好的解决方案:

return A::mem[0];

正是我想要的!

【问题讨论】:

你也可以直接(*this)[0];mem[0] “考虑到我无法从派生类访问该变量,这是访问 mem 元素的正确方法吗” - 您确实可以从派生类访问,因为 mem 是声明protected How to use base class's constructors and assignment operator in C++?的可能重复 【参考方案1】:

你可以说(*this)[0]

不过,在任何版本的 C++ 中,没有什么能阻止您使用 mem[0]

【讨论】:

除了理智什么都没有。当基础成员已经通过整洁的界面“控制”时,您不应该直接访问它们。我实际上会尽快制作mem private 我认为任何声明为protected 的东西都是公平的游戏。如果您不应该访问它,它应该是private。但除此之外,我同意,我只是指出 C++11 中没有任何神秘规则会阻止你这样做,如果你真的想这样做。 mem 受到保护,但我无法访问它! error: 'mem' was not declared in this scope @userrandomnumbers:如果您需要精确的帮助,您将不得不发布精确的代码,而不仅仅是一些有点像您实际拥有的东西。 @user3728501:甚至可能想提出一个新问题。也许吧。【参考方案2】:

是的,这是一个很好的方法。您可以写成(*this)[0],让通话更愉快。

然而,如果你不介意绕过基类的接口(我不会——我实际上会写memprivate),你可以mem[0]

如果您遇到问题,那是由于您的测试用例中没有的东西。例如,if it's a base member in a class template, you may need to write this-&gt;mem[0] due to a C++ oddity。

【讨论】:

为什么不允许this-&gt;[0];?看起来语法不一致? @user3728501:这不是不一致的。 我可以打电话给this-&gt;Get(0),或者this-&gt;anyotherfunction() @user3728501: [] 不是函数调用表示法。你不写obj.[0] 所以缺少ptr-&gt;[0] 并不是不一致。 即;为什么编译器不将this-&gt;[N];解释为this-&gt;operator[](N);

以上是关于C++ 从类中调用重载运算符的主要内容,如果未能解决你的问题,请参考以下文章

在C++中,啥是运算符重载?啥是虚函数?

枚举类中的 c++ 运算符重载

尝试在模板类中重载 / 运算符的 C++ 错误

[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载

C++函数调用运算符 函数对象 函数指针

C++运算符重载学习总结