假设我创建了一个类对象,在类中包含某些私有变量和公共访问器以及mutator公共函数来访问/更改这些变量。
现在假设我在主函数中创建了该类对象的实例,我们称之为A。在main()中,我调用在main()之外声明的函数,我在A中传递,实例是类对象。 我想要做的是,在这些外部函数中,使用已实现的公共mutator函数,在main()之外,更改实例A的现有私有变量中的值。 有了我的代码,我一直试图这样做,让我们说像这样传递:
randomFunction(objectInstance);
在main()之外定义的随机函数中,我尝试改变私有变量中的值,如下所示:
void randomFunction(classObject objectInstance){
...
objectInstance.changeValue(657428391);
...
}
但实际值未在main()中更新。 我可以用类对象实例做一些指针魔术吗?
答案 0 :(得分:2)
您按值传递classObject
,而不是按引用传递,因此您正在制作对象的副本,而不是修改传入的对象。
因此,您对objectInstance
所做的任何更改都是对象的本地副本,而不是传入的对象。您必须将功能签名更改为
void randomFunction(classObject& objectInstance)
或者你可以使用指针
void randomFunction(classObject* objectInstance)
然后将该函数调用为
randomFunction(&objectInstance);
答案 1 :(得分:1)
据我所知,你传递的对象是值而不是引用。使用:
void randomFunction(classObject& objectInstance){
这样就会复制引用,你在randomFunction中所做的更改将反映在main函数中。
答案 2 :(得分:0)
您正在按值传递对象。按值传递对象时,该函数正在处理对象的临时副本,而不是实际对象本身。如果这样做,您在函数中所做的任何更改都不会反映回调用者。
通过引用而不是值传递对象:
void randomFunction(classObject& objectInstance)
{
objectInstance.changeValue(123456);
}
现在您将看到反映回调用者的值,因为您实际上正在使用传递的对象。
请注意,与<{1}},int
等类型相比, no 不同。仅仅因为它是一个对象并不会改变规则。例如:
double
你会看到#include <iostream>
void someFunction(int x)
{
x = 10;
}
int main()
{
int a = 0;
someFunction(a);
std::cout << a;
}
的值仍为0,即使调用了一个函数将传入的变量更改为10.原因是,函数a
获取其参数按价值。将其更改为引用,您会看到someFunction
更改为10。
答案 3 :(得分:0)
我认为你的功能看起来像这样:
void DoSomeStuff(A instance);
如果是这种情况,那么您正在创建一个新变量,这是一个副本,因此事实上您更改了本地副本,而不是实际变量。
您可以将其声明为
void DoSomeStuff(A &instance); //reference to A
或
void DoSomeStuff(A *instance); //pointer to A
在这些情况下,您将真正更改传递给这些函数的变量