英文:
Returning reference to segments of underlying array
问题
我正在努力通过编写一个类来提高C++的水平,类似于向量的对象。
我希望它具有一个重载运算符[],接受一个std::initializer_list<int>
,用于输入底层数组的索引,并返回数组中这些元素的引用。
所以像这样的东西是可能的:
MyVector arr = {1, 2, 3, 4};
arr[{0, 2}] = 3;
// 或者
arr[{0, 2}] = {5, 6};
我考虑过创建另一个类,该类继承自MyVector,并为这个类编写一个赋值运算符
MyVector::operator[](std::initializer_list<int> ind){
return MyVectorRef(this, ind);
}
class MyVectorRef: private MyVector{
MyVector* base;
std::initializer_list<int> indices;
MyVectorRef(MyVector* base, ind): base(base), indices(ind) {};
MyVector operator=(std::initializer_list<int> cp){
for(int i: indices){
(*base).data[i] = cp[i];
}
}
// 对于第一种情况也是类似的...
};
我知道这很巧妙,可能甚至不起作用。而且,如果我希望进行方法级联,可能会出现一些问题。
是否有更好的方法来解决这个问题?
英文:
Im trying to get better at C++ by coding up a class for a vector like object.
I wish for it to have an operator overloading for [], that takes in an std::initializer_list<int>
for input of indices on underlying array, and returns a reference to those elements of the array.
So something like this would be possible:
MyVector arr = {1, 2, 3, 4};
arr[{0, 2}] = 3;
// or
arr[{0, 2}] = {5, 6};
What I've thought of is to create another class that inherits MyVector, and write an assignment operator for this class
MyVector::operator[](std::initializer_list<int> ind){
return MyVectorRef(this, ind);
}
class MyVectorRef: private MyVector{
MyVector* base;
std::initializer_list<int> indices;
MyVectorRef(MyVector* base, ind): base(base), indices(ind) {};
MyVector operator=(std::initializer_list<int> cp){
for(int i: indices){
(*base).data[i] = cp[i];
}
}
// similarly for the first case...
};
I know this is very hacky, maybe wont even work. Also, may be of some problem if i wish to have method cascading.
Is there a better way to work around this?
答案1
得分: 1
几个问题:你的 operator[]
函数签名不正确:它应该是 MyVectorRef MyVector::operator[](std::initializer_list<int> ind)
,因为C++不允许省略operator[]
的返回类型。
如果你在 operator[]
下声明了 MyVectorRef
,当C++编译 MyVectorRef operator[](...)
这一行时,C++不会识别 MyVectorRef
是什么,所以会抛出错误。要解决这个问题,你需要在 MyVector
上方添加一个不完整的类声明,声明 MyVectorRef
,就像这样:
class MyVectorRef; // MyVectorRef 的不完整类声明
class MyVector {
//...
MyVectorRef operator[](std::initializer_list<int> ind); // operator[] 的方法声明
};
class MyVectorRef {
MyVector* base;
std::initializer_list<int> indices;
//...
}; // MyVectorRef 的完整定义
MyVectorRef MyVector::operator[](std::initializer_list<int> ind) {
return MyVectorRef(this, ind);
}
不完整类声明的目的是告诉编译器 MyVectorRef
标记存在,这样当编译器编译 operator[]
的方法声明时,它知道 MyVectorRef
是一个类。
英文:
A few issues: Your function signature for operator[]
is incorrect: it should be MyVectorRef MyVector::operator[](std::initializer_list<int> ind)
, as C++ doesn't allow you to omit the return type for operator[]
.
If you declare MyVectorRef
under operator[]
, when C++ compiles the line MyVectorRef operator[](...)
, C++ doesn't recognize what MyVectorRef
is, so it throws an error. To solve this, you have to add an incomplete class declaration for MyVectorRef
above MyVector
.
So something like this:
class MyVectorRef; //incomplete class declaration for MyVectorRef
class MyVector {
//...
MyVectorRef operator[](std::initializer_list<int> ind); //method declaration for operator[]
};
class MyVectorRef {
MyVector* base;
std::initializer_list<int> indices;
//...
}; //complete definition of MyVectorRef
MyVectorRef MyVector::operator[](std::initializer_list<int> ind) {
return MyVectorRef(this, ind);
}
The reason for the incomplete class declaration is essentially to tell the compiler that the token MyVectorRef
exists, so that when the compiler compiles the method declaration for operator[]
, it knows that MyVectorRef
is a class.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论