【问题标题】:Pass global struct to a class as reference将全局结构作为参考传递给类
【发布时间】:2019-05-10 15:04:57
【问题描述】:

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

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

ma​​in.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;    
}

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

【问题讨论】:

  • 您的main 缺少返回类型int。在所有coutendl 之前还缺少std::class1 的成员函数在类定义中都缺少返回类型。您使用init 函数而不是类构造函数是否有原因? #include &lt;iostream&gt; 也不见了。为了避免给你错误的提示:为什么你需要mainClass 来保存对mainPort 的引用而不是直接或通过复制引用mainPort
  • 上面的代码只是一个示例,我只是简化了,根据主题相关,不相关的行已被删除

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


【解决方案1】:

您正在复制您传入的 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-&gt;dummy = 20;。然后在你的main.cpp 文件中:

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

但是,您确实需要小心代码中的原始指针,并为您的未来工作研究智能指针。

【讨论】:

  • 你可能是对的,我如何将它分配给指针并在 class1 中使用它
  • @meakcey:我已经添加了解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2015-12-02
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
相关资源
最近更新 更多