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_number на number_of_account в «account.h» и «AccountHandler.cpp»
а также
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
Если вы определите что-то в заголовке, то это будет определено в каждой единице перевода, которая включает этот заголовок — в вашем случае оба AccountHandler
а также main
, Вам следует объявлять в заголовке (если к нему нужно получить доступ из нескольких блоков), и определять это только в одном исходном файле.
Предполагая, что это статический член класса (я должен догадаться, так как вы забыли показать нам код), вы хотите что-то вроде:
// header
class AccountHandler
{
public:
static size_t number_of_account; // declaration
// other members...
};
// source file
size_t AccountHandler::number_of_account; // definition
Предположительно, в вашем коде это определение находится в заголовке.
Предполагается, что он вообще должен быть статичным; что он не зависит от какой-либо конкретной учетной записи (например, он представляет количество существующих учетных записей), а не связан с каждой учетной записью (например, он представляет номер учетной записи). Если он не должен быть статическим, убедитесь, что он не объявлен static
,
Включить охранников не поможет с этим; они предотвращают включение заголовка более одного раза в каждую единицу перевода, но все же позволяют включать их из нескольких единиц.
Других решений пока нет …