此指针和 suqare 括号过载

This pointer and suqare bracket overload

本文关键字:suqare 指针      更新时间:2023-10-16

在我的类的公共方法中访问溢出的方括号时出现问题。这是代码:

#include <iostream>
#include <cassert>
#include <cmath>
using namespace std;
template<unsigned int DIM> class Vector
{
private:
    double mData[DIM];
public:
    Vector(double tableau[DIM])
    {
        for(int i=0; i<DIM; i++)
        {
            mData[i] = tableau[i];
        }
    }
    double operator[](int index)
    {
        assert(index < DIM);
        assert(index > -1);
        assert(-pow(10,-6)<=mData[index]<=1+pow(10,-6));
        if(mData[index]>=0 && mData[index]<=1)
        {
            return mData[index];
        }
        else if(mData[index]<0 && mData[index]>=pow(10,-6))
        {
            return 0.0;
        }
        else if(mData[index]>1 && mData[index]<= 1+ pow(10,-6))
        {
            return 1.0;
        }
    }
    double getDim() const
    {
        return DIM;
    }
    void print() const
    {
        for(int i=0;i<getDim();i++)
        {
            cout << this[i] << " "; //PROBLEM!!
        }
    }
};
int main()
{
    double err=pow(10,-6);
    double tableau[5];
    tableau[0] = 0.5;
    tableau[1] = 0.79;
    tableau[2] = err;
    tableau[3] = 1+err;
    tableau[4] = 0;
    Vector<5> proba(tableau);
    proba.print();
}

我已经尝试过*这个,这个>,但似乎有什么工作。我希望你能帮助我。弗洛伦特

成员运算符重载需要类类型的值或引用,this是一个指针。 因此,在使用运算符之前,您需要取消引用this指针,如下所示:

(*this)[i]

或者你可以直接调用运算符,它的优点是其意图完全明确,但缺点是有点罗嗦和更晦涩(因此更有可能绊倒任何阅读它的人):

this->operator[](i)

如果您已经尝试过*this[i]并发现它不能解决问题,那是因为它实际上意味着*(this[i])

除了错误的运算符 [] 实现之外,还有错误的使用:-

cout << this[i] << " ";

这应该是

 cout << (*this)[i] << " "; //is you want to implement that way...

this只是一个指针,所以要访问operator[]你可以先取消引用它:

cout << (*this)[i] << " ";

或者直接调用函数(不是首选):

cout << this->operator[](i) << " ";