2016-03-28 53 views
1

对于发布这样一个基本问题,我表示歉意,但我无法找到一个体面的答案,为什么这不起作用,以及如何使其工作。C++:从函数中更改班级成员值

我简化了我的问题在这里:

#include <iostream> 
using namespace std; 

class A { 
public: 
int x; 
}; 

void otherFunction() { 
A A; 
cout<<"X: "<<A.x<<endl; 
} 

int main(){ 
A A; 
A.x = 5; 
otherFunction(); 

return 0; 
} 

执行类成员成为构建之后维持恒定?

如何扩大对班级所做更改的范围?

结构是否受限于这种方式?

非常感谢您提供答案。

+1

非常感谢您为什么它不起作用的答案和理由。它正在工作 –

回答

0

它正在做它应该做的事情。 您正在函数otherFunction中创建一个新对象A,该新对象将在该函数的本地。 在主函数otherFunction的调用之后打印A.x的值,您将看到A.x的值已更改。

0

main中的变量AotherFunction中的变量A不同,所以它们不会具有相同的值。

otherFunction访问main中的值A的一种方法是将其作为参数传入。例如:

void otherFunction(A p) { 
    cout<<"X: "<<p.x<<endl; 
} 

int main(){ 
    A a; 
    a.x = 5; 
    otherFunction(a); 

    return 0; 
} 

我已经改变了变量的名称,使它更清晰一些。主要是a,并且a副本被传递到otherFunction。该副本在otherFunction中被称为potherFunctionp所做的修改不会导致对a的任何更改。如果要这样做,则需要通过引用传递,这可能是比现在更进一步的话题。

3

您没有得到预期的输出结果,因为在otherFunction()中,您正在创建一个类型A的新对象,但您尚未为其分配值!

在C++阅读上scope of a variable了解更多

尝试运行下面给出的代码,你应该得到的输出为5

#include <iostream> 
using namespace std; 

class A { 
public: 
    int x; 
}; 

void otherFunction(A a) { 
    cout << "X: " << a.x << endl; 
} 

int main(){ 
    A a; 
    a.x = 5; 
    otherFunction(a); 

    return 0; 
} 

或者你可以做到这一点,认为这是一个很好的在OOP练习

class A{ 
private: 
    int x; 
public: 
    void update(int newx){ 
     x = newx; 
    } 
    int getX(){ 
     return x; 
    } 
}; 

int main(){ 
    A a; 
    a.update(5); 
    cout << a.getX() << endl; 
    return 0; 
}