首先,我将尝试解释我想要做的事情,然后解释我正在尝试的行为
我有一个main.cpp文件,我有一些对象,例如x,y,z。我想在main.cpp中定义这个对象并将它们传递给一个函数来初始化它们,最后使用它们。
这是我的代码的一部分
int main(){
X* x = NULL;
Y* y = NULL;
Z* z = NULL;
function(x,y,z);
x->getX();
return 0;
}
void function (X* x, Y* y, Z* z){
x = new X();
y = new Y();
z = new Z();
}
此代码导致x->getX();
中的分段错误。我使用gdb运行程序,并且在function()
中正确创建了对象,但是当执行从function
退出时,对象被销毁,x = y = z = 0x0。
我认为当你通过引用函数传递一个对象时,你可以修改对象的成员而不是对象本身。
所以,我的问题是如何在main中声明一个对象,然后将它传递给一个函数进行初始化,最后在main中使用它。
感谢。
答案 0 :(得分:3)
您需要pass by reference.目前您正在传递值,该值将创建您的值的副本。这是一个简单的例子,考虑2个函数:
void dontEdit(int a) {
a = 2;
}
void edit(int &a) {
a = 2;
}
dontEdit
a
将被复制,更改a
的值将不会影响外部世界。在edit
中,您将函数引用提供给保存a
的内存,以便您能够在函数范围之外检测到此更改。考虑一下它们的用途:
int main() {
int a = 5;
cout << "a is: " << a << endl;
dontEdit(a); // this is pass by value, a copy of a is made.
cout << "a is: " << a << endl;
edit(a); // this is pass by reference, a is edited directly.
cout << "a is: " << a << endl;
return 0;
}
输出将是:
a is: 5
a is: 5
a is: 2
在你的问题中,你有同样的问题。您想要编辑main
范围x
,但是您可以按值传递它。您将创建指针x
的副本并将其分配给new X()
。然后当你返回时,x
的副本不再存在,你创建的内存被挂起,你无法找到它。所以你需要做什么通过引用传递:
void function (X* &x, Y* &y, Z* &z) {
最后一点,c++
没有自动垃圾回收,因此对于每个new
,都应该有一个delete
,否则您将面临memory leaks
的风险。
答案 1 :(得分:1)
您的功能应声明为
void function (X* &x, Y* &y, Z* &z)
因为你想传递参数作为参考,以便能够修改指针x,y和z。
X*
表示指向X
&
表示......的参考。
因此
X* &x
表示指向X
有关详细信息,请查看以下问题,其中包含您需要了解的基础知识:
答案 2 :(得分:0)
我认为你应该使用,恕我直言,真正的好财产,传递参考。但是,如果要使用间接传递引用,则实际参数应在callee之前,&
为function(&x,&y,&z);
。但它对C ++并不好。因为它具有真正的传递参考功能。我错了吗?