奇怪的多重定义错误

Strange multiple definition error

本文关键字:定义 错误      更新时间:2023-10-16
vio@!@#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
AccountHandler.o:(.bss+0x0): multiple definition of `AccountHandler::account_number'
main.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

我得到了上面的错误信息。但是我找不到它是乘法定义的代码,所以我在'account.h'和'AccountHandler.cpp'中将所有account_number更改为number_of_account。和

vio@!@#$:~/cpp/OOP/6$ vi AccountHandler.cpp 
vio@!@#$:~/cpp/OOP/6$ g++ -c AccountHandler.cpp 
vio@!@#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
vio@!@#$:~/cpp/OOP/6$

它编译得很好。

之后,我对main.cpp做了一点修改

vio@!@#$:~/cpp/OOP/6$ g++ -c main.cpp
vio@!@#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
AccountHandler.o:(.bss+0x0): multiple definition of `AccountHandler::number_of_account'
main.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

和错误信息再次出现。

我使用#ifndef #define #define在所有的头文件和当我改变AccountHandler.cpp和accounthandler.h中的变量时,它又编译好了,所以我想知道为什么会发生

代码如下:

#ifndef __ACCOUNTHANDLER_H__
#define __ACCOUNTHANDLER_H__
#include "account.h"
class AccountHandler
{
private:
    Account* account[100];
    static int number_of_account;
public:
    AccountHandler(){}
    void show_menu();
    void make_account();
    void deposit_money();
    void withdraw_money();
    void show_all_account_info();
    ~AccountHandler();
};
int AccountHandler::number_of_account=0;
#endif

如果您在头文件中定义了某些内容,那么它将在包含该头文件的每个翻译单元中定义-在您的情况下,包括AccountHandlermain。您应该在头文件中声明它(如果需要从多个单元访问它),并且在一个源文件中定义它。

假设它是一个静态类成员(我不得不猜测,因为您忘记向我们展示代码),您需要这样的内容:

// header
class AccountHandler 
{
public:
    static size_t number_of_account; // declaration
    // other members...
};
// source file
size_t AccountHandler::number_of_account; // definition

在你的代码中,这个定义大概在头文件中。

这是假设它是静态的;它独立于任何特定的帐户(例如,它表示存在的帐户数量),而不是与每个帐户相关联(例如,它表示一个帐户号码)。如果它不应该是静态的,那么确保它没有声明为static

Include保护不能解决这个问题;它们可以防止头信息在每个翻译单元中被包含多次,但仍然允许它们从多个单元中被包含。