将全局结构传递给 class 作为参考
Pass global struct to a class as reference
我正在尝试定义一个结构变量并通过 类 用作下面的示例。我只想分配一次结构变量,而不是在每个函数中分配 get/set。
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;
}
我想我找不到引用和指针的正确组合。
您正在复制传入的 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.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();
但是,您确实需要小心处理代码中的原始指针,并在未来的工作中研究智能指针。
我正在尝试定义一个结构变量并通过 类 用作下面的示例。我只想分配一次结构变量,而不是在每个函数中分配 get/set。
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;
}
我想我找不到引用和指针的正确组合。
您正在复制传入的 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.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();
但是,您确实需要小心处理代码中的原始指针,并在未来的工作中研究智能指针。