返回使用new创建的对象

时间:2015-04-30 01:08:24

标签: c++ pointers object reference

我有以下方法:

void* func1()
{
    MyClass myClassObject;
    func2(myClassObject);

    //myClassObjects's changes from func2() should be available here

    //Todo - I want to make myClassObj's entire structure/data visible in another method myMain() - see below
}

void* func2(MyClass &myObj)
{
     //make changes to myObj
     //the return type does not make a problem here
     //so - (void*)(0) would/would not be fine. 
}

void myMain()
{
    doSomeX();

    MyClass x = func1();

    doSomeY(x);
}

问题是myClassObject会在func1()退出时超出范围,并将垃圾数据返回到myMain()。

所以我在func1()中创建了对myClassObject的引用并返回了它 参考,只是知道这里出现了相同的范围问题。

我尝试使用new来创建MyClass的另一个对象并将其返回给myMain()。但是,问题是,一旦我访问myMain()

中的返回对象,程序就会崩溃

另外,如果我将myMain中的x声明为void *并执行 x = func1(),程序将编译,但问题是当我将x类型转换为MyClass时。

问题陈述:在func1()中创建一个对象,将其传递给func2(),对传递的对象进行更改,然后将其返回给myMain()并在那里使用返回的对象。

我不应该改变func1()的函数原型。

1 个答案:

答案 0 :(得分:1)

为什么不直接返回对象的副本?

MyClass func1()
{
    MyClass myClassObject;
    func2(myClassObject);

    // do whatever you want with myClassObject

    return myClassObject;
}

void func2(MyClass &myObj)
{
     // make changes to myObj
     // Notice I am returning void, not void*
}

void myMain()
{
    doSomeX();
    MyClass x = func1();
    doSomeY(x);
}

如果您不想更改func1()的定义,那么您应该使用func1()new中创建一个指针并返回:

void* func1()
{
    MyClass *myClassPtr = new MyClass;
    func2(myClassPtr);

    // do whatever you want with myClassObject

    return myClassPtr;
}

// Notice I passed a pointer now, not a reference
void func2(MyClass *myObj)
{
     // make changes to myObj
     // Notice I am returning void, not void*
}

void myMain()
{
    doSomeX();
    MyClass* x = (MyClass*) func1();
    doSomeY(x);

    // Don't forget to delete
    delete x;
}

在这种情况下,你将处理指针。