将全局结构作为引用传递给类



我正在尝试定义一个结构变量,并使用through类作为下面的示例。我只想给结构变量赋值一次,而不是在每个函数中都赋值。

全局.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;    
}

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

您正在复制传入的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中的副本,而不会更改全局对象。

为了实现您的目标,您需要更改class1.hclass的定义,如下所示:

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();

然而,您确实需要小心代码中的原始指针,并为未来的工作寻找智能指针。

最新更新