2013-04-26 134 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