Методы уже определены в *.obj

271
09 ноября 2017, 06:14

Добрый день, первый раз столкнулся с такой проблемой. При компиляции вылазит следующее для каждого метода:

Ошибка  LNK2005 "public: __thiscall GVS::GVS(void)" (??0GVS@@QAE@XZ) уже определен в head.obj   kurs    D:\cpp\kurs\kurs\main.obj   1

Собственно сам код:
head.h

#pragma once
#include <iostream>
#include <string>
using namespace std;
class s4et4ik                       //шаблон
{
private:
    double V;                       //расход в секунду
    double energy;                  //потребляемая энергия
    double V_1;                     //расход за сутки
public:
    int T1_enter;
    int T2_exit;
    s4et4ik();                      //конструктор по умолчанию
    s4et4ik(double v_per_sec, double Energy, double v_per_day) { // конструктор для счетчиков
        V = v_per_sec;
        V_1 = v_per_day;
        energy = Energy;
    }
    double get_V();                 //получение значения мгновенного расхода
    double get_energy();            //получение потребляемой энергии
    double get_V_1();               //получение расхода за сутки
    int get_t1();                   //получение температуры на входе
    int get_t2();                   //получение температуры на выходе
    void change_V_per_sec();        //изменение значения расхода в секунду
    void change_V_per_day();        //изменение значение расхода за сутки
    void t1_enter();                //температура на входе
    void t2_exit();                 //температура на выходе
    virtual void save();            //сохранение полученных значений
    virtual void show_info()=0;     //отображение данных
    virtual ~s4et4ik() {}
};
class GVS : public s4et4ik {        //счетчик горячей воды
private:
    double Q;                       //Гигокаллории
public:
    GVS();                          //конструктор по умолчанию
    GVS(double v_per_sec, double v_per_day, double energy) : s4et4ik(v_per_sec, energy, v_per_day) { // конструктор для ГВС
    }
    void show_info();               //отображение данных
    double ggcall();                //расчет гигокаллорий
    void save();
    ~GVS();

};
class HV : public s4et4ik {
public:
    HV();                           //конструктор по умолчанию
    HV(double v_per_sec, double v_per_day, double energy) : s4et4ik(v_per_sec, energy, v_per_day) {}//конструктор для ХВ
    void show_info();
    void save();
    ~HV();
};

head.cpp

#pragma once
#include "head.h"
void GVS::show_info() {
    cout << "\t\t\tСчетчик горячей воды" << endl << endl
        << "Мгновенный расход: " << this->get_V() << endl
        << "Расход за сутки: " << this->get_V_1() << endl
        << "Потребляемая энергия: " << this->get_energy()
        << "Гигокаллории: " << this->ggcall() << endl;
}
double s4et4ik::get_energy() {
    return this->energy;
}
double s4et4ik::get_V() {
    return this->V;
}
double s4et4ik::get_V_1() {
    return this->V_1;
}
double GVS::ggcall() {
    this->Q = get_V() / (get_t2() - get_t1());
    return this->Q;
}
int s4et4ik::get_t2() {
    return T2_exit;
}
int s4et4ik::get_t1() {
    return T1_enter;
}
void HV::show_info() {
    cout << "Температура воды: " << this->get_t1() << endl
        << "Мгновенный расход: " << this->get_V() << endl
        << "Расход за сутки: " << this->get_V_1() << endl;
}
void s4et4ik::change_V_per_day() {}
void s4et4ik::change_V_per_sec() {}
void s4et4ik::t1_enter() {}
void s4et4ik::t2_exit() {}
void s4et4ik::save() {}
void GVS::save() {}
void HV::save() {}
s4et4ik::s4et4ik() {}
GVS::GVS() {}
GVS::~GVS() {}
HV::HV() {}
HV::~HV() {}

main.cpp

#include "head.cpp"
int main() {
    return 0;
}
Answer 1

Не делайте так:

#include "head.cpp"

Включайте через #include заголовочный файл с объявлениями, но не с определениями. Так, как сделали вы, у вас масса определенных (не объявленных, а именно определенных) функций оказывается скомпилированной как в файле head.obj, так и в main.obj, и компоновщик не знает, какой из вариантов выбрать.

READ ALSO
Помогите с решением [требует правки]

Помогите с решением [требует правки]

Написать перегруженную функцию для сложения: десятичных дробей и обыкновенных дробей (дробь задана числителем и знаменателем)Как вычислить...

251
Событие полностью введенной даты

Событие полностью введенной даты

Вообщем необходимо после введения даты менять минимальное времяЕсть input с типом date, мне нужно отследить события полного ввода этого поля,...

250