Что означает «дублировать символ _heating_unit в BangBangControlTest.o и BangBangControl.o»? - PullRequest
0 голосов
/ 24 февраля 2012

Я получаю эту ошибку при попытке скомпилировать мой код.

$ g++ -o BangBangControlTest BangBangControl.o BangBangControlTest.o ld: duplicate symbol _heating_unit in BangBangControlTest.o and BangBangControl.o for architecture x86_64 collect2: ld returned 1 exit status

Я новичок в C ++ и не могу понять, что не так.Я просмотрел много учебников и просмотрел похожие сообщения об ошибках, полученные другими пользователями стека.Вот мои занятия."BangBangControlTest.cpp"

// Test function
#include <iostream>
#include "BangBangControl.h"
using namespace std;

int main(){
  BangBangControl control(50, true, 75);

for(int i = 0; i < 50; i++){
std::cout << "Temp = " << control.update() << endl;
}

return 0;

}

"BangBangControl.cpp"

#include <iostream>
#include "BangBangControl.h"
using namespace std;

BangBangControl::BangBangControl(int temp, bool isOn, int initialTemp){
  heating_unit = HeatingUnit(isOn, initialTemp);
  temp_to_maintain = temp;
}

void BangBangControl::setTemp(int temp){temp_to_maintain = temp;}
int BangBangControl::getTemp(){return temp_to_maintain;}
int BangBangControl::update(){
  int b=heating_unit.tick();
  if (b  > temp_to_maintain + 2) heating_unit.turnOff();  if (b  < temp_to_maintain - 2) heating_unit.turnOn();
  return b;
}

"BangBangControl.h"

// BangBangControl header
#include <iostream>
#include "HeatingUnit.h"
using namespace std;

HeatingUnit heating_unit;
int temp_to_maintain;

class BangBangControl{

 public:
   BangBangControl(int, bool, int);
    void setTemp(int);
    int getTemp();
    int update();
 };

"HeatingUnit.cpp"

// HeatingUnit class implementation

#include <iostream>
#include "HeatingUnit.h"

using namespace std;

HeatingUnit::HeatingUnit(bool a, int b){
  isOn = a;
  temp = b;
}

void HeatingUnit::turnOn(){isOn = true;}

void HeatingUnit::turnOff(){isOn = false;}

int HeatingUnit::tick(){
  if(isOn && temp <= 100){
    return ++temp;

}
  else if((!isOn) && temp >= 0){
    return --temp;
  }
  else{
    return temp;
  }
}

"HeatingUnit.h"

#include <iostream>
using namespace std;

class HeatingUnit{
  public:
    bool isOn;
    int temp;

    HeatingUnit();
    HeatingUnit(bool, int);
    void turnOn();
    void turnOff();
    int tick();
};

1 Ответ

1 голос
/ 24 февраля 2012

Вы видите, что HeatingUnit heating_unit; в вашем заголовочном файле? Вам нужно поставить extern перед ним и скопировать оригинальную версию без extern в файл .cpp, опционально указав там начальное значение.

Подробнее об этом можно прочитать здесь: Как использовать extern для обмена переменными между исходными файлами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...