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::account_number
(илиAccountHandler::number_of_account
)? Как вы это декларируете? Как вы это определяете? И самое главное, где вы это определяете? Вам нужно показать нам какой-то код, иначе ответить на этот вопрос, не угадывая, будет практически невозможно. - person Some programmer dude   schedule 26.04.2013static
), либо просто объявить его какextern
и определить ровно в одной единице перевода. - person jrok   schedule 26.04.2013extern
в объявлении. Если бы это было в пространстве имен, то давать ему внутреннюю компоновку почти наверняка было бы неправильно, поскольку вы получите отдельную копию в каждой единице перевода; это, мягко говоря, сбивает с толку. - person Mike Seymour   schedule 26.04.2013{}
. - person Mike Seymour   schedule 26.04.2013__ACCOUNTHANDLER_H__
), и имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации. Не используйте их. - person Pete Becker   schedule 26.04.2013