Whenever I try to run the following code, it says multiple definition of fin, client1, client2 and client3. Ive search throughout the internet but it seems I can
t solve it by myself.Also, theres no problem with the code as I can easily run it if it`s in a single file.
struct_defined.h
struct Card{
char nume_banca[20];
int cod_bancar;
int pin;
char nume_client[20];
char prenume_client[20];
double suma_bani;
};
functions.h
#include <iostream>
#include <string.h>
#include <fstream>
#include "struct_defined.h"
using namespace std;
ifstream fin("date.in");
Card client1, client2, client3;
int verificare_client(Card &utilizator);
int verificare_sold(Card utilizator);
int extragere_numerar(Card &utilizator);
int transfer_bani(Card &utilizator, Card &utilizator2);
functions.c
#include "functions.h"
int verificare_client(Card &utilizator)
{
int y,x;
marcaj_verificare:
cout<<"\nIntroduceti codul dvs. PIN: ";
cin>>y;
if (utilizator.pin == y){
cout<<"\nInregistrarea a fost efectuata cu succes.Va rugam selectati tranzactia pe care doriti s-o faceti: ";
cout<<"\n1.Interogare sold"<<"\n"<<"2.Retragere numerar"<<"\n"<<"3.Transfer bancar"<<"\n"<<"4.Terminati sesiunea";
}
else{
cout<<"\nCod PIN invalid.Va rugam reintroduceti codul dvs. PIN";
goto marcaj_verificare;
}
}
int verificare_sold(Card utilizator)
{
cout<<"\nSuma de bani disponibila in momentul de fata este "<<utilizator.suma_bani<<" lei";
}
int extragere_numerar(Card &utilizator)
{
int x,y;
marcaj:
cout<<"\nIntroduceti suma de bani pe care doriti s-o extrageti: ";
cin>>x;
if(x <= utilizator.suma_bani){
cout<<"\nSuma de bani a fost extrasa cu succes.Va multumim! ";
utilizator.suma_bani -= x;
}
else{
cout<<"\nSuma de bani introdusa depaseste suma de bani disponibila.Va rugam introduceti o alta suma";
goto marcaj;
}
}
int transfer_bani(Card &utilizator, Card &utilizator2)
{
int x;
if (utilizator.cod_bancar%2 == utilizator2.cod_bancar%2){
marcaj3:
cout<<"\nIntroduceti suma pe care doriti s-o trimiteti: ";
cin>>x;
if(x <= utilizator.suma_bani){
cout<<"\nSuma de bani a fost trimisa cu succes.Va multumim! ";
utilizator.suma_bani -= x;
utilizator2.suma_bani += x;
}
else{
cout<<"\nSuma de bani introdusa depaseste suma de bani disponibila.Va rugam introduceti o alta suma";
goto marcaj3;
}
}
else
cout<<"\nPersoana careia incerceti sa trimiteti bani nu este clientul bancii noastre";
}
main.cpp
#include "functions.h"
int main()
{
fin>>client1.nume_banca>>client1.cod_bancar>>client1.pin>>client1.nume_client>>client1.prenume_client>>client1.suma_bani;
fin>>client2.nume_banca>>client2.cod_bancar>>client2.pin>>client2.nume_client>>client2.prenume_client>>client2.suma_bani;
fin>>client3.nume_banca>>client3.cod_bancar>>client3.pin>>client3.nume_client>>client3.prenume_client>>client3.suma_bani;
int answer;
verificare_client(client1);
marcaj_main:
getchar();
answer = getchar();
if(answer == '1'){
verificare_sold(client1);
cout<<"\nSelectati urmatoarea tranzactie pe care doriti s-o efectuati: ";
goto marcaj_main;
}
else
if(answer == '2'){
extragere_numerar(client1);
cout<<"\nSelectati urmatoarea tranzactie pe care doriti s-o efectuati: ";
goto marcaj_main;
}
else
if(answer == '3'){
transfer_bani(client1,client2);
cout<<"\nSelectati urmatoarea tranzactie pe care doriti s-o efectuati: ";
goto marcaj_main;
}
else
if(answer == '4'){
cout<<"Sesiunea curenta a fost terminata.";
}
return 0;
}
"functions.h" is getting included from both "functions.c" and "main.cpp". Since you have defined (not just declared) fin, client1, client2 and client3 in the "functions.h" file, linker will complain about multiple definitions. That is because two compilation units (one corresponding to main.cpp, and the other to functions.c) will have definitions of these variables, hence the conflict.
Try moving out the definitions of these variables to a .c or .cpp file, and only retain the declarations in the .h file. That should resolve this issue.
Here's a related question and answer - Why aren't my compile guards preventing multiple definition inclusions?