c ++通过引用传递问题
c++ pass by reference issue
如何将对集合的引用传递给另一个 class 以便让那个 class 修改它?以直观的方式尝试(即传递和存储引用 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 has 10 items
0 1 2 3 4 5 6 7 8 9
myVec has 0 items
当您创建 Test
对象时,您通过引用传递 myVec
,但 testvec
实际上是一个值。所以它会复制当时myVec
的值,这是一个空向量。
变化
std::vector<int> testvec;
至
std::vector<int>& testvec;
它会起作用的。但是你还需要调整构造函数:
Test(std::vector<int>& myVec) : testvec(myVec) {}
评论说明:
由于成员 testvec
现在是一个 reference 那么它必须指向内存中的某个现有对象。
必须在 Test
class 的实例构造时初始化,否则 testvec
将不是有效的引用类型,因此程序格式错误。
Initialization list 在构造函数主体之前触发。它也是为所有成员分配默认值或指定值的地方。对于引用,唯一有效的值是内存(或引用)中的现有对象,因此您必须明确告诉引用成员我必须使用的值进行初始化。
例如
class A {
int& t;
A(int& T) : t(T) {} // * OK
A(int& T) { t = T; } // ** ill-formed
}
(*) 可以,因为 t
在调用构造函数主体
之前设置为 T
(**) 不行,因为 t
是在初始化列表之后设置的,所以在设置默认值的步骤之后。
它不起作用,因为您使用的是按值传递而不是按引用传递。要在 C++ 中使用按引用传递,您的实际参数应该像 Test test(& myVec);
,而在函数的接收端它的参数应该像 Test(std::vector<int>* vec)
(在您的情况下它是构造函数)。在按引用传递时,必须发送变量的地址,在按值传递时,必须发送变量的实际值。
你应该简单地使用
std::vector<int> *testvec;
您将为其发送地址 "myVec"
Test test(& myVec);
构造函数应该是这样的:
Test(std::vector<int>* vec) {
testvec = vec;
}
到处休息
testvec.properties();
你必须使用
testvec->properties();
那就一定能用。
这里是 link 的解决方案:http://ideone.com/7DWJ9O
如何将对集合的引用传递给另一个 class 以便让那个 class 修改它?以直观的方式尝试(即传递和存储引用 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 has 10 items
0 1 2 3 4 5 6 7 8 9
myVec has 0 items
当您创建 Test
对象时,您通过引用传递 myVec
,但 testvec
实际上是一个值。所以它会复制当时myVec
的值,这是一个空向量。
变化
std::vector<int> testvec;
至
std::vector<int>& testvec;
它会起作用的。但是你还需要调整构造函数:
Test(std::vector<int>& myVec) : testvec(myVec) {}
评论说明:
由于成员 testvec
现在是一个 reference 那么它必须指向内存中的某个现有对象。
必须在 Test
class 的实例构造时初始化,否则 testvec
将不是有效的引用类型,因此程序格式错误。
Initialization list 在构造函数主体之前触发。它也是为所有成员分配默认值或指定值的地方。对于引用,唯一有效的值是内存(或引用)中的现有对象,因此您必须明确告诉引用成员我必须使用的值进行初始化。
例如
class A {
int& t;
A(int& T) : t(T) {} // * OK
A(int& T) { t = T; } // ** ill-formed
}
(*) 可以,因为 t
在调用构造函数主体
T
(**) 不行,因为 t
是在初始化列表之后设置的,所以在设置默认值的步骤之后。
它不起作用,因为您使用的是按值传递而不是按引用传递。要在 C++ 中使用按引用传递,您的实际参数应该像 Test test(& myVec);
,而在函数的接收端它的参数应该像 Test(std::vector<int>* vec)
(在您的情况下它是构造函数)。在按引用传递时,必须发送变量的地址,在按值传递时,必须发送变量的实际值。
你应该简单地使用
std::vector<int> *testvec;
您将为其发送地址 "myVec"
Test test(& myVec);
构造函数应该是这样的:
Test(std::vector<int>* vec) {
testvec = vec;
}
到处休息
testvec.properties();
你必须使用
testvec->properties();
那就一定能用。
这里是 link 的解决方案:http://ideone.com/7DWJ9O