问题描述
当前,我正在创建自己的向量类,并且我想通过共享指针创建任何类的实例。因此,有没有一种方法可以使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;
}