C ++:如何在main之外访问类对象的私有变量?

时间:2014-12-01 21:19:11

标签: c++ class pointers

假设我创建了一个类对象,在类中包含某些私有变量和公共访问器以及mutator公共函数来访问/更改这些变量。

现在假设我在主函数中创建了该类对象的实例,我们称之为A。在main()中,我调用在main()之外声明的函数,我在A中传递,实例是类对象。 我想要做的是,在这些外部函数中,使用已实现的公共mutator函数,在main()之外,更改实例A的现有私有变量中的值。 有了我的代码,我一直试图这样做,让我们说像这样传递:

randomFunction(objectInstance);

在main()之外定义的随机函数中,我尝试改变私有变量中的值,如下所示:

void randomFunction(classObject objectInstance){
...
objectInstance.changeValue(657428391);
...
}

但实际值未在main()中更新。 我可以用类对象实例做一些指针魔术吗?

4 个答案:

答案 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

在这些情况下,您将真正更改传递给这些函数的变量