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

c++: how to pass a variable's value from one class to another?

本文关键字:一个 另一个 变量 C++      更新时间:2023-10-16

我有一个类"a",它从应用程序的GUI中获取变量的值。假设其中一个变量是"X"。然后,在另一个类"B"中,我想调用这个"X",并将其值传递给另一个函数。

我所做的是,我在类"B"中创建了一个类"A"的对象,称为"对象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",当我在函数2中调试"x"的值时,每次调试时它都会给我随机数。所以,我只是猜测这些随机值已经存在于内存中,这意味着"X"的值没有正确传递。

我认为,尽管对象已经创建,但它每次都会创建变量"x"的新实例。即:不是从classA中获取"x"的值,它只是创建一个带有所有变量的classA对象。

我的问题是如何将在类a中获得的"x"的值直接传递给类B,而不创建其变量的新实例?


更新:

感谢doctorlove的答案,我的代码现在运行良好。我的问题是在"objectA"创建后初始化它并给它赋值。我所做的是创建对象并直接在"classB"中传递它。这就是为什么我得到了随机值,因为它只是一个新的对象,在创建时在内存中有任何值。

不清楚你想做什么。如果你有这样的事情。。。

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;
}

编辑2如果您在其他地方有一个现有的objectA,那么将传递给构造函数

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

如果这不可能,你的设计需要改进。如果没有任何代码可供查看,我将无能为力。

假设您得到了一个类a和一个私有int变量i,B和一个私人int变量X,

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 
...
}

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

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

相关文章: