【问题标题】:C++ Calling overloaded operator from within a classC++ 从类中调用重载运算符
【发布时间】: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];

正是我想要的!

【问题讨论】:

标签: 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);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多