c++ - 模块化编程 C++ 多重定义

标签 c++ modular definitions

每当我尝试运行以下代码时,它都会显示 fin、client1、client2 和 client3 的多重定义。我在整个互联网上搜索过,但似乎我无法自己解决它。此外,代码没有问题,因为如果它在单个文件中,我可以轻松运行它。

结构定义.h

    struct Card{
        char nume_banca[20];
        int cod_bancar;
        int pin;
        char nume_client[20];
        char prenume_client[20];
        double suma_bani;
    };

函数.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);

函数.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";

}

主要.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?

关于c++ - 模块化编程 C++ 多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33085156/

相关文章:

C++ - 无法将 CSV 解析到我的结构中

c - 如何在模块化编程中使用结构?

javascript - 设置变量并传递给函数还是重新设置变量?

javascript - "Good"实现 declare() 函数的实践

c++ - 用于实时信号处理的快速 C++ 正弦和余弦替代方案

c++ - win2003 服务器中多字符串注册表字段中的垃圾字符

models - Swagger 2.0 : How to declare a definition property of type model?

visual-studio-2010 - 是否可以导出 TFS 2010 构建定义?

c++ - 删除指针而不是变量

eclipse - 使用 Java 11 在 Eclipse 中混合模块化和非模块化开发