2015-10-12 4 views
2

Когда я пытаюсь запустить следующий код, он говорит о множественном определении fin, client1, client2 и client3. I ve search throughout the internet but it seems I can t решить его самостоятельно. Также нет проблем с кодом, так как я могу легко запустить его, если он в одном файле.Модульное программирование С ++ несколько определений

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

Вы заявили те, в заголовочном файле, а затем включен файл заголовка в нескольких единицах трансляции (т.е.: main.cpp и functions.c). Дополнительная информация [здесь] (http://stackoverflow.com/questions/11072244/c-multiple-definitions-of-a-variable) –

+0

У вас есть файлы заголовков [include guard] (https://en.wikipedia.org/вики/Include_guard)? – NathanOliver

+0

@MohamadElghawi Видел это уже, но похоже, что я не могу решить свой код ... – Gusti

ответ

1

«functions.h» входит в число «functions.c» и «main.cpp». Поскольку вы определили (а не только объявили) fin, client1, client2 и client3 в файле «functions.h», компоновщик будет жаловаться на несколько определений. Это связано с тем, что две единицы компиляции (одна из которых соответствует main.cpp, а другая функции functions.c) будут иметь определения этих переменных, следовательно, конфликт.

Попробуйте переместить определения этих переменных в файл .c или .cpp и сохраните только декларации в файле .h. Это должно решить эту проблему.

Вот родственный вопрос и ответ - Why aren't my compile guards preventing multiple definition inclusions?

+0

Большое спасибо! Он, наконец, работал – Gusti

Смежные вопросы