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

时间:2015-12-28 23:10:29

标签: c++

首先,我将尝试解释我想要做的事情,然后解释我正在尝试的行为

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

感谢。

3 个答案:

答案 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

Live example

在你的问题中,你有同样的问题。您想要编辑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

的引用

有关详细信息,请查看以下问题,其中包含您需要了解的基础知识:

How to pass objects to functions in C++?

答案 2 :(得分:0)

我认为你应该使用,恕我直言,真正的好财产,传递参考。但是,如果要使用间接传递引用,则实际参数应在callee之前,&function(&x,&y,&z);。但它对C ++并不好。因为它具有真正的传递参考功能。我错了吗?