如何重载operator []以索引自定义矢量类的shared_ptr元素?

问题描述

当前,我正在创建自己的向量类,并且我想通过共享指针创建任何类的实例。因此,有没有一种方法可以使operator[]重载以实现以下代码

class myVector {
    public:
        myVector(/*some params*/);
        ~myVector();

        // Some kind of overloading of operator []

        // Some other code

    private:
        // private container array
        double* vec;

        // Some other code
};

int main ()
{
    std::shared_ptr<myVector> sp = std::shared_ptr<myVector>(new myVector(/*some params*/));

    double val = sp[1];

    return 0;
}

解决方法

您可以为[]类声明myVector运算符,如下所示(返回对该元素的引用,以便您具有读写访问权限):

double& operator [] (int i)
{
    return vec[i];
}

然后可以通过首先取消引用shared_ptr指向的对象上使用此运算符。这是一个可运行的示例,其中我向构造函数添加了一些“虚拟”代码,以使其能够执行某些操作:

#include <iostream>
#include <memory>

class myVector {
public:
    myVector(/*some params*/) {
        vec = new double[10];
        for (int i = 0; i < 10; ++i) vec[i] = 3 * i;
    }
    ~myVector() {
        delete[] vec;
    }
    double& operator [] (int i) {
        return vec[i];
    }
 private:
    double* vec;
};

int main()
{
    std::shared_ptr<myVector> sp = std::shared_ptr<myVector>(new myVector(/*some params*/));
    double val = (*sp)[6];
    std::cout << val << std::endl;
    (*sp)[4] = 312;
    std::cout << (*sp)[4] << std::endl;
    return 0;
}
,

您可以通过以下方式重载该类的运算符

double & operator []( size_t i )
{
    return vec[i];
}

const double & operator []( size_t i ) const
{
    return vec[i];
}

并称呼它

std::shared_ptr<myVector> sp = std::shared_ptr<myVector>(new myVector(/*some params*/));

//...

std::cout << ( *sp )[i] << '\n';
,

我不会在实际应用中这样做。但是,仅出于演示目的,从std :: shared_ptr派生一种实现您想要的目标(至少在技术上)的可能性,然后在其中声明索引运算符。例如:

#include <memory>
#include <vector>
using namespace std;

template <class T>
class myshared_ptr;

template <class T >
class myshared_ptr<vector<T>> : public shared_ptr<vector<T>>
{
public:
    using elem_type = vector<T>;
    using shared_ptr<elem_type>::shared_ptr;
    using shared_ptr<elem_type>::operator*;
    using shared_ptr<elem_type>::get;
    
    typename elem_type::value_type& operator[](size_t idx)
    {
        return (*get())[idx];
    }
};

int main(int argc,const char * argv[]) {
    // insert code here...
    std::cout << "Hello,World!\n";
    auto p = myshared_ptr<vector<int>>(new vector<int>{1,2,3,4});
    cout << p[2] << endl;
    return 0;
}

Live Demo