[email protected][email protected]#$:~/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” 和奇怪的多重定义错误
[email protected][email protected]#$:~/cpp/OOP/6$ vi AccountHandler.cpp
[email protected][email protected]#$:~/cpp/OOP/6$ g++ -c AccountHandler.cpp
[email protected][email protected]#$:~/cpp/OOP/6$ g++ -o main main.o NormalAccount.o HighCreditAccount.o Account.o AccountHandler.o
[email protected][email protected]#$:~/cpp/OOP/6$
它编译好。
在那之后,我改变了的main.cpp有点
[email protected][email protected]#$:~/cpp/OOP/6$ g++ -c main.cpp
[email protected][email protected]#$:~/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')?你如何申报?你如何定义它?最重要的是,你在什么地方定义它?你需要向我们展示一些代码,否则几乎不可能在没有猜测的情况下回答这个问题。 – 2013-04-26 10:29:21
标题保护仅防止在单个翻译单元中包含多个包含(并因此包含多个定义)。如果您在头文件中定义了一个全局对象,那么您将在每个包含该头文件的翻译单元(cpp)中定义它(使用它定义一个定义规则)。您可以使用内部链接('static')定义对象,或者仅将其声明为“extern”,并在一个翻译单元中定义。 – jrok 2013-04-26 10:32:36
@jrok:由于它看起来是一个静态类成员,所以不能给它内部链接,或者在声明中使用'extern'。如果它在命名空间范围内,那么给它内部连接几乎肯定是一件错误的事情,因为你将在每个翻译单元中获得单独的副本;这至少可以说是令人困惑的。 – 2013-04-26 10:47:49