我有以下方法:
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()的函数原型。
答案 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;
}
在这种情况下,你将处理指针。