Передайте глобальную структуру классу как ссылку - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь определить переменную структуры и использовать ее через классы в качестве примера ниже.Я просто хочу присвоить структурную переменную один раз, а не получать / устанавливать в каждой функции.

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 голосов
/ 09 декабря 2018

Вы копируете переданный вами 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, а не глобальный объект.

ВЧтобы достичь своей цели, вам нужно изменить определение class в class1.h следующим образом:

class class1{

    structPort* classPort;

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

с соответствующим изменением на structPort* в class1.cpp файл, помня его изменить на classPort->dummy = 20; с classPort.dummy = 20;.И затем в вашем main.cpp файле:

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

Однако вам нужно быть осторожным с необработанными указателями в вашем коде и искать умные указатели для своей будущей работы.

...