模块化编程 C++ 多重定义
Modular programming C++ multiple definitions
每当我尝试 运行 下面的代码时,它都会说 fin、client1、client2 和 client3 的多重定义。我ve search throughout the internet but it seems I can
无法通过 myself.Also 解决它,代码没有问题,因为如果它在单个文件中,我可以轻松 运行 它。
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" 被包含在 "functions.c" 和 "main.cpp" 中。由于您已经在 "functions.h" 文件中定义(不仅仅是声明)fin、client1、client2 和 client3,链接器将抱怨多个定义。那是因为两个编译单元(一个对应main.cpp,另一个对应functions.c)将有这些变量的定义,因此冲突。
尝试将这些变量的定义移出到.c 或.cpp 文件中,只保留.h 文件中的声明。这应该可以解决这个问题。
这是一个相关的问答 - Why aren't my compile guards preventing multiple definition inclusions?
每当我尝试 运行 下面的代码时,它都会说 fin、client1、client2 和 client3 的多重定义。我ve search throughout the internet but it seems I can
无法通过 myself.Also 解决它,代码没有问题,因为如果它在单个文件中,我可以轻松 运行 它。
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" 被包含在 "functions.c" 和 "main.cpp" 中。由于您已经在 "functions.h" 文件中定义(不仅仅是声明)fin、client1、client2 和 client3,链接器将抱怨多个定义。那是因为两个编译单元(一个对应main.cpp,另一个对应functions.c)将有这些变量的定义,因此冲突。
尝试将这些变量的定义移出到.c 或.cpp 文件中,只保留.h 文件中的声明。这应该可以解决这个问题。
这是一个相关的问答 - Why aren't my compile guards preventing multiple definition inclusions?