将全局结构传递给类作为参考

时间:2018-12-09 14:36:58

标签: c++ class struct pass-by-reference

我正在尝试定义一个struct变量,并在以下示例中通过类使用。我只想分配一次结构变量,而不是在每个函数中都进行获取/设置。

global.h

struct structPort{
  unsigned int portno;
  unsigned int timeleft;
  int dummy;
};

extern structPort mainPort; // this one is wanted to be used through classes

class1.h

#include "global.h"
class class1{

    structPort classPort;  // just wanted to deal with this inside class

    public:
        init(structPort &_prt);
        changeDummy();
}

class1.cpp

void class1::init(port &_prt){
    classPort = _prt;
}

void class1::changeDummy(){
    classPort.dummy = 20;
    cout << classPort.dummy << endl;
}

main.cpp

#include "global.h"
#include "class1.h"

structPort mainPort;
class1 mainClass;

main(){

    mainPort.portno = 1;
    mainPort.dummy = 10;
    cout << mainPort.dummy << endl; 
    // this gives 10 - OK//   

    mainClass.init(mainPort);
    mainClass.changeDummy();
    // this gives 20 - OK//

    // reaching from the main again gives 10 - NOT OK
    // what i expected to see is 20
    cout << mainPort.dummy << endl;    
}

我认为我找不到引用和指针的正确组合。

1 个答案:

答案 0 :(得分:0)

您正在复制传入的structport,而不是存储对其的引用(无论如何,这里的指针更合适)。在您的class1定义中,有以下一行:

structPort classPort;  // just wanted to deal with this inside class

请注意,这不是引用或指针,而只是一个值,因此这意味着在执行此操作时应使用init:

void class1::init(port &_prt){
    classPort = _prt;  // This copies prt to classPort, not a reference to it
}

它将prt中当前的值复制到classPort,然后在class1::changeDummy中对其进行修改时,它仅更改mainClass中的副本,而不更改全局对象。 / p>

为了实现您的目标,您需要按以下步骤更改 class1.h class的定义:

class class1{

    structPort* classPort;

    public:
        init(structPort* _prt);
        changeDummy();
};

,在 class1.cpp 文件中对structPort*进行了相应的更改,记住它已从classPort->dummy = 20;更改为classPort.dummy = 20;。然后在您的main.cpp文件中:

mainClass.init(&mainPort);
mainClass.changeDummy();

但是,您确实需要注意代码中的原始指针,并研究智能指针以用于将来的工作。