如何将对集合的引用传递给另一个类,以使该类对其进行修改?尝试以直观的方式尝试(即传递和存储参考collection& c
,然后使用该参考进行更新)似乎不起作用:
#include <iostream>
#include <vector>
class Test{
private:
std::vector<int> testvec;
public:
Test(std::vector<int>& vec){
testvec = vec;
}
void add(int i){
testvec.push_back(i);
}
void report(){
std::cout << "testvec has " << testvec.size() << " items" << "\n";
for(int i : testvec)
std::cout << i << " ";
if(!testvec.empty())
std::cout << "\n";
}
};
int main() {
std::vector<int> myVec;
Test test(myVec);
for(int i = 0; i < 10; i++){
test.add(i);
}
test.report();
std::cout << "\n";
std::cout << "myVec has " << myVec.size() << " items" << "\n";
for(int i : myVec)
std::cout << i << " ";
return 0;
}
会给我
testvec有10个项目
0 1 2 3 4 5 6 7 8 9
myVec有0个项目
创建Test
对象时,您是通过myVec
引用传递的,但testvec
实际上是一个值。因此它将复制当时的值myVec
,这是一个空向量。改变
std::vector<int> testvec;
到
std::vector<int>& testvec;
它会工作。但是您还需要调整构造函数:
Test(std::vector<int>& myVec) : testvec(myVec) {}
对此发表评论:
由于membertestvec
现在是引用,因此它必须指向内存中的某些现有对象。
必须在构造Test
类的实例时将其初始化,否则testvec
将不是有效的引用类型,因此程序将格式错误。
初始化列表在构造函数主体之前触发。在这里,还为所有成员分配了默认值或指定的成员。对于引用,唯一有效的值是内存(或引用)中的现有对象,因此您必须明确地告诉引用成员必须使用它们初始化的值。
例如。
class A {
int& t;
A(int& T) : t(T) {} // * OK
A(int& T) { t = T; } // ** ill-formed
}
(*)可以,因为在调用构造函数主体之前已将t
其设置为T
(**)可能不正确,因为t
在初始化列表之后设置了,所以在设置默认值的步骤之后。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句