我正在开发天文馆软件时学习C ++。我正在使用Visual Studio Enterprise 2015。
我通过引用传递两个类实例时遇到了麻烦。
这是我创建两个类实例并将它们传递给方法的方法:
MyTime* newRightAscension = new MyTime(0, 0, 0, 0, 0);
DegreesCoordinate* newDeclination = new DegreesCoordinate(0, 0, 0, NotSet);
precession->RigorousMethod(epoch1, rightAscension, declination, epoch2, newRightAscension, newDeclination);
这是precession->RigorousMethod
方法声明:
void Precession::RigorousMethod(
DateTime * epoch1,
MyTime * rightAscension,
DegreesCoordinate * declination,
DateTime * epoch2,
MyTime* newRightAscension,
DegreesCoordinate* newDeclination)
这就是我如何更新该方法中的newRightAscension
和newDeclination
值:
newDeclination = new DegreesCoordinate(decResult->getDegrees(), decResult->getMinutes(), decResult->getSeconds(), decResult->getDirection());
newRightAscension = new MyTime(raResult->getHour(), raResult->getMinute(), raResult->getSeconds(), raResult->getTimeZone(), raResult->getDayLightSavings());
创建一个新实例,但是当我在方法执行后检查这些值时,它们没有这些值。
我做错了什么?
答案 0 :(得分:1)
一种方法(使用通过引用传递的指针):
MyTime* newRightAscension = 0; // Don't create an object yet
DegreesCoordinate* newDeclination = 0;
precession->RigorousMethod(epoch1, rightAscension, declination, epoch2, newRightAscension, newDeclination);
...
void Precession::RigorousMethod(
DateTime * epoch1,
MyTime * rightAscension,
DegreesCoordinate * declination,
DateTime * epoch2,
MyTime*& newRightAscension,
DegreesCoordinate*& newDeclination)
当函数负责创建这两个对象时,这是有道理的。所以你不想初始化指向虚拟对象的指针。在声明时,指针根本不需要初始化,但初始化为0将使代码更安全。
答案 1 :(得分:0)
在RigorousMethod
之外,您为MyTime
和DegreesCoordinate
个对象分配内存。当您调用该方法时,您将指针传递给这些内存地址,您不会传递引用。在您的方法中,您只需通过将它们设置为新分配的对象的地址,重置本地指针变量的内存地址(最初指向您在方法之外创建的对象的内存地址)。这当然对原始实例没有影响。相反,唯一的影响是你有一个内存泄漏,因为RigorousMethod
之外没有指针可以访问新创建的对象。如果要查看快速效果,请将参数从Type*
更改为Type&
,更改指向引用的指针,然后替换pointer_to_object = new Constructor{ /*something*/ }
。使用reference_to_object = Constructor{ /*something*/ }
,例如更改MyTime*
- > MyTime&
和newRightAscension = new MyTime{ /*something*/ }
到newRightAscension = MyTime{ /*something*/ }
。然后将参数传递为*pointer_to_object
,而不是仅传递pointer_to_object
。