此操作员功能的参数太多

时间:2017-10-14 10:08:07

标签: c++

首先,我不擅长英语,也是第一次使用StackOverflow,但我试着解释一下我的代码问题。

我被要求从我的professer制作我自己的Vector(类似的东西),并且在fuction中有一个问题,它返回对向量容器中请求位置的元素的引用。如果请求的位置超出范围,它应输出一些消息并终止程序。

我应该将此设置为运算符重载,这是我的代码。

        double operator [](int n, const MyDoubleVector& _mV)//The arror come out at this line.
    {
        if(n > num)//'num' is private reference in class to count array. it typed int.
        {
            return 0;
        }

        return &_mV.data[n];//'data' is private reference in class. It declare like 'double *data = new double [num];'
    }

我有时会看到朋友'解决这个问题,但是当我把朋友'在这一行中,它说我喜欢" operator []必须是一个成员函数。"  最后,我不知道该怎么做。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

您需要将operator []的重载实现为类MyDoubleVector的成员函数。 以下是定义:

double & MyDoubleVector::operator[](int index);

答案 1 :(得分:0)

必须将

运算符[]定义为类的成员。

示例:

#include <iostream>
#include <cstdlib>
#include <algorithm>

struct MyDoubleVector
{
    MyDoubleVector()
    {}

    MyDoubleVector(MyDoubleVector const& other)
    {
        // very naiive copy constructor
        if (other.data)
        {
            std::for_each(other.data, other.data + other.num, [&](double val)
            {
                this->push(val);
            });
        }
    }

    MyDoubleVector& operator=(MyDoubleVector const& other)
    {
        auto temp = other;  // invoke copy constructor
        std::swap(num, temp.num);
        std::swap(capacity, temp.capacity);
        std::swap(data, temp.data);
        return *this;
    }

    ~MyDoubleVector()
    {
        delete [] data;
    }

    double& operator [](int n);
    /** either define the method inline like this...
    {
        if(n > num)
        {
            std::cerr << "MyDoubleVector::operator[]: index " << n << " out of range" << std::endl;
            std::exit(100);
        }

        return data[n];
    }
    **/

    void push(double val)
    {
        if (num == capacity)
        {
            more();
        }
        data[num++] = val;
    }

private:

    void more()
    {
        if (!data)
        {
            data = new double [10];
            capacity = 16;
        }
        else
        {
            auto newcapacity = capacity * 2;
            auto newdata = new double [newcapacity];
            std::copy(data, data + capacity, newdata);
            std::swap(data, newdata);
            capacity = newcapacity;
            delete [] newdata;
        }
    }

    int num = 0;
    int capacity = 0;
    double* data = nullptr;
};

/** ...
    ** or out of line like this
    **/

double& MyDoubleVector::operator [](int n)
{
    if(n > num)
    {
        std::cerr << "MyDoubleVector::operator[]: index " << n << " out of range" << std::endl;
        std::exit(100);
    }

    return data[n];
}


int main()
{
    MyDoubleVector v;
    v.push(10.0);
    v[1];
}