通过引用传递类实例
Pass class instance by reference
我在开发天文馆软件的同时学习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());
创建一个新实例,但是当我在方法执行后检查这些值时,它们没有这些值。
我做错了什么?
一种方法(使用通过引用传递的指针(:
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
。
- 对显式实例化的模板函数的未定义引用
- 重载运算符*以获取对另一个类的实例的引用
- 为什么我不能引用指向实例化对象的函数的指针?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- 将元组和整型实例合并到引用元组中
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 引用的静态强制转换强制模板实例化,其中不完整的类型很好
- 为什么不能在实例化对基类的引用的同时实例化指向派生类的指针?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 超出返回引用的单一实例生存期
- 反向函数不反转类实例化的引用字符串
- 通过引用将私有类实例传递到另一个类 C++ 的"get"函数中
- 多个实例保存对unique_ptr的引用
- 类模板实例化和通用引用
- 对从静态实例引用的类模板的静态成员的未定义引用
- 如何正确格式化类实例引用
- 如何在类构造函数中存储实例引用