2013-04-26 132 views
0
[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 
+0

什么是'AccountHandler :: account_number'(或'AccountHandler :: number_of_account')?你如何申报?你如何定义它?最重要的是,你在什么地方定义它?你需要向我们展示一些代码,否则几乎不可能在没有猜测的情况下回答这个问题。 – 2013-04-26 10:29:21

+0

标题保护仅防止在单个翻译单元中包含多个包含(并因此包含多个定义)。如果您在头文件中定义了一个全局对象,那么您将在每个包含该头文件的翻译单元(cpp)中定义它(使用它定义一个定义规则)。您可以使用内部链接('static')定义对象,或者仅将其声明为“extern”,并在一个翻译单元中定义。 – jrok 2013-04-26 10:32:36

+0

@jrok:由于它看起来是一个静态类成员,所以不能给它内部链接,或者在声明中使用'extern'。如果它在命名空间范围内,那么给它内部连接几乎肯定是一件错误的事情,因为你将在每个翻译单元中获得单独的副本;这至少可以说是令人困惑的。 – 2013-04-26 10:47:49

回答

3

如果您在头定义的东西,那么它会在每一个翻译单元,包括头定义 - 在你的情况下,两个AccountHandlermain。你应该声明它在一个头(如果它需要从多个单位访问),并且定义它只在一个源文件中。

假设它是一个静态类成员(我在猜测,因为你忘了我们展示的代码),你想要的东西,如:

// header 
class AccountHandler 
{ 
public: 
    static size_t number_of_account; // declaration 

    // other members... 
}; 

// source file 
size_t AccountHandler::number_of_account; // definition 

据推测,在你的代码,这个定义是在标题中。

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

包括警卫对此无能为力;他们会阻止标题在每个翻译单元中被多次包含,但仍允许将它们从多个单元中包含。

+0

我能理解,但那我该如何解决这个问题? 我需要在main中使用AccountHandler类,它在accounthandler.h中声明,并在AccountHandler.cpp中定义。 我应该结合accounthandler.h和AccountHandler.cpp吗? 而且,编辑AccountHandler.cpp和accounthandler.h后为什么编译好? – user2323357 2013-04-26 10:54:26

+0

@ user2323357:它看起来像它在头部定义的。但是没有看到你的代码,我不能确定;这只是你对编译器的反对。仔细查看所有标题以确保它们中没有任何标题。 – 2013-04-26 11:00:28

+0

@ user2323357:“我应该结合accounthandler.h和AccountHandler.cpp吗?”几乎肯定不是。只要确保你的头文件只包含变量的声明而不是定义。 – 2013-04-26 11:01:19