2015-12-12 70 views
0

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

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

我在做什么错?

+0

您显示的代码是传递一个指针,而不是“引用实例”,而您的预期用途似乎需要通过引用传递指针:在'RigorousMethod'的签名中,这将是'DegreesCoordinate *&newDeclination'。但是,然后你所描述的看起来像是内存泄漏,所以你可能应该改变更多。 – JSF

+0

您正在newDeclination和newRightAscension中创建一个新的类实例,覆盖传递给该函数的指针的值(并导致内存泄漏)。如果要更改在函数外创建的实例的类成员的值,只需调用set函数即可。如果你想在函数内部分配新的实例,你需要通过**或*& - 不需要在函数外部分配。 – EylM

+0

你真的想通过创建一个新的对象来改变'newDeclination'吗?这将通过传递'*&'来完成,正如我在第一条评论中所描述的那样。但通过'&'传递并更改对象的内容(而不是创建新对象)可能更有意义。 – JSF

回答

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

+0

谢谢。有用!! – VansFannel

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