通过引用传递类实例

Pass class instance by reference

本文关键字:实例 引用      更新时间:2023-10-16

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

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

我做错了什么?

一种方法(使用通过引用传递的指针(:

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 将使代码更安全。

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