c ++:如何将变量的值从一个类传递到另一个类?

时间:2013-08-01 10:12:34

标签: c++

我有一个类“A”,它从应用程序的GUI中获取变量的值。让我们说其中一个变量是“X”。然后,在另一个类“B”中,我想将其称为“X”并将其值传递给另一个函数。

我所做的是在类“B”中创建了一个名为“objectA”的类“A”的对象,然后调用“X”的值如下:

// class A:
void classA::function1(int gui_value){
    x= gui_value;
}

然后在另一个班级:

//class B:
void classB::run(){
.
.
function2(/* I need to pass x here */); 
.
.
}

函数和x都在头文件中正确定义。

我所做的是我在头文件中创建了classA的对象(让我们说:objectA),并使用“objectA”在“classB”中的“function2”中调用“x”的值,如下所示:

//class B:
void classB::run(){
.
.
function2(objectA->x); 
.
.
}

让我们说“x”值等于“5”,当我在function2中调试“x”的值时,每次调试时它都会给我随机数。所以,我只是猜测这些随机值已经存在于内存中,这意味着“X”的值没有正确传递。

我认为,虽然创建了对象,但每次都会创建一个变量“x”的新实例。即:没有从classA中获取“x”的值,它只是创建一个包含其所有变量的classA对象。

我的问题是如何将classA中获得的“x”的值直接传递给classB而不创建其变量的新实例?


更新:

感谢 doctorlove的 回答,我的代码现在运行正常。我的问题是在创建“objectA”并为其赋值之后初始化它。我正在做的是创建对象并直接在“classB”中传递它。这就是为什么我得到随机值,因为它只是一个新的对象,在创建时在内存中具有任何价值。

3 个答案:

答案 0 :(得分:1)

假设您有一个带有私有int变量i的A类,以及带有私有int变量X的B,

class A{
private:
int i;  
// if you want to use x within A you have to declare the  object here 
B  objectB;
.....
public :
int getI();
int setI();
};

// the second class  B 
class B(){
private :
int X;
......
public :
int getX();
void setX();
..

};

让我们说你有一个main()函数

int main (){
  A objA;
  B objB;

  objB.setX(5);//X is now 5 
  objA.setI(objB.getx());  // i has the value of X which is 5 
...
}

答案 1 :(得分:1)

目前尚不清楚你要做什么。如果你有这样的东西......

class A
{
    private:
    int X;//ignoring any thing about encapsulation for now
};

class B
{
//...
    public:
    void DoSomething()
    {
        A objectA; 
        //makes objectA another A each time we get here, with X uninitialised
        //use objectA.X which has random numbers in
    }

};

这将与您描述的问题类似。如果您将objectA改为成员并正确初始化,则可能会执行您想要的操作。使用class A和之前一样,

class B
{
//...
    private:
    A objectA;
    public:
    B() 
    {
        objectA.X = 42;
    }
    void DoSomething()
    {
        //use member objectA.X 
    }

};

修改 显然,在我的例子中,我已经无处可撤出了42个。如果你有一个合理的值来自gui,请将其发送给B的构造函数。如果它发生了变化,你需要引用它。

explicit B(int gui_value)
{
    objectA.X = gui_value;
}

<强> EDIT2 如果其他地方有objectA,则将 传递给构造函数

explicit B(const A & otherA)
    : objectA(otherA)
{
}

如果不可能,那么您的设计需要改进。没有任何代码可以看,我再也无法帮助了。

答案 2 :(得分:0)

由于创建objectA时没有编译时错误,因此成功创建了对象。

要传递变量,而不是使用箭头操作符,请使用点(。)运算符 y = objectA.X