Странная множественная ошибка определения

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

0

Решение

Если вы определите что-то в заголовке, то это будет определено в каждой единице перевода, которая включает этот заголовок — в вашем случае оба 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,

Включить охранников не поможет с этим; они предотвращают включение заголовка более одного раза в каждую единицу перевода, но все же позволяют включать их из нескольких единиц.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]