gpt4 book ai didi

c++ - 在函数外部声明对象,将其作为引用传递,然后在函数内部创建它

转载 作者:行者123 更新时间:2023-11-30 01:45:32 24 4
gpt4 key购买 nike

首先我将尝试解释我想做什么,然后解释我正在试验的行为

我有一个 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 中使用它。

谢谢。

最佳答案

您需要pass by reference.目前您正在传递值,这将创建您的值(value)的拷贝。这是一个简单的例子,考虑 2 个函数:

void dontEdit(int a) {
a = 2;
}

void edit(int &a) {
a = 2;
}

dontEdit中,a会被复制,改变a的值对外界没有影响。在 edit 中,您为函数提供了一个 reference 到保存 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

Live example

在你的问题中你有同样的问题。您想要编辑 main 作用域 x,但您按值传递了它。您将创建指针 x 的拷贝并将其分配给 new X()。然后当你返回时,那个 x 的拷贝不再存在,你创建的内存悬而未决,你无法找到它。那么你需要做什么 通过引用传递:

void function (X* &x, Y* &y, Z* &z) {

最后要注意的是,c++ 没有自动垃圾回收,所以对于每个 new 都应该有一个 delete,否则你运行风险memory leaks .

关于c++ - 在函数外部声明对象,将其作为引用传递,然后在函数内部创建它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com