首页 文章

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

提问于
浏览
0

我试图定义一个struct变量,并通过类作为下面的示例使用 . 我只想分配一次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

    您正在复制传入的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();
    

    但是,您需要小心代码中的原始指针,并查看适合您未来工作的智能指针 .

相关问题