通过引用传递类实例

时间:2015-12-12 18:54:03

标签: c++ visual-studio-2015

我正在开发天文馆软件时学习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)

这就是我如何更新该方法中的newRightAscensionnewDeclination值:

newDeclination = new DegreesCoordinate(decResult->getDegrees(), decResult->getMinutes(), decResult->getSeconds(), decResult->getDirection());
newRightAscension = new MyTime(raResult->getHour(), raResult->getMinute(), raResult->getSeconds(), raResult->getTimeZone(), raResult->getDayLightSavings());

创建一个新实例,但是当我在方法执行后检查这些值时,它们没有这些值。

我做错了什么?

2 个答案:

答案 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之外,您为MyTimeDegreesCoordinate个对象分配内存。当您调用该方法时,您将指针传递给这些内存地址,您不会传递引用。在您的方法中,您只需通过将它们设置为新分配的对象的地址,重置本地指针变量的内存地址(最初指向您在方法之外创建的对象的内存地址)。这当然对原始实例没有影响。相反,唯一的影响是你有一个内存泄漏,因为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