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]
,让通话更愉快。
然而,如果你不介意绕过基类的接口(我不会——我实际上会写mem
private
),你可以写mem[0]
!
如果您遇到问题,那是由于您的测试用例中没有的东西。例如,if it's a base member in a class template, you may need to write this->mem[0]
due to a C++ oddity。
【讨论】:
为什么不允许this->[0];
?看起来语法不一致?
@user3728501:这不是不一致的。
我可以打电话给this->Get(0)
,或者this->anyotherfunction()
?
@user3728501: []
不是函数调用表示法。你不写obj.[0]
所以缺少ptr->[0]
并不是不一致。
即;为什么编译器不将this->[N];
解释为this->operator[](N);
以上是关于C++ 从类中调用重载运算符的主要内容,如果未能解决你的问题,请参考以下文章