在函数外部声明对象,将其作为引用传递,然后在函数内部创建它
Declare object outside function, pass it as reference and then create it inside function
首先我将尝试解释我想做什么,然后解释我正在试验的行为
我有一个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中使用它。
谢谢。
您需要通过引用传递。当前您正在传递值,该值将创建您的值的副本。这里有一个简单的例子,考虑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
的风险。
您的函数应该声明为
void function (X* &x, Y* &y, Z* &z)
因为您希望将参数作为引用传递,以便能够修改指针x、y和z。
X*
表示指向X 的指针
&
表示。。。
因此
X* &x
表示指向X 的指针的引用
查看以下问题以了解更多详细信息,其中包含您需要了解的基本信息:
如何在C++中将对象传递给函数?
我认为你应该使用,IMHO这个真正好的属性,通过引用传递。但是,如果要通过引用使用间接传递,则被调用者中的实际参数应以&
作为function(&x,&y,&z);
在前。但这对C++来说并不好。因为它具有实传参考功率。我错了吗?
- 为什么我的递归函数按降序打印,然后按升序打印?
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 为什么 ComPtr 的函数返回不同的值,然后 &?
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何在C++中获取lua函数作为参数,然后调用它
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- 使用函数打开文件,然后让其他函数利用该文件?
- C++:将向量传递给函数,然后在main中调用函数.错过了什么
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- C++大括号初始值设定项作为参数调用不同的构造函数,然后预期
- C++ 如何创建 2D 数组,将其传递给另一个函数,然后打印
- 如何在 LLVM 传递期间破坏然后解散函数?
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- 需要在调用函数然后检查errno之前清理errno
- 声明一个没有内容的函数;-然后是内容{}- c++