2009-04-18 142 views
0

我有什麼似乎是一個鏈接錯誤在Eclipse/C(「未定義參考」)++麻煩。下面顯示的所有類都可以很好地編譯,除了一個PlayGame.cpp,它給出了「未定義引用」錯誤(下面還顯示)。C++/Eclipse中未定義的引用問題

下面是相關的類和代碼段。

PlayerFactory.h

PlayerFactory.cpp

Game.h

Game.cpp

// constructor for game: 

Game::Game (const PlayerFactory& factory) 

{ 

     cout << " constructor" << endl; 

} 

PlayGame.cpp

// start of code for game where error occurs 

#include "Game.h" 

#include "PlayerFactory.h" 

int main() { 
    try 

    { 

     PlayerFactory factory; 

     Game game (factory); <== undefined reference error 
     ... 

上面一行給出了Ë rror「undefined reference to`Game(PlayerFactory const &)'」

什麼原因導致了這個錯誤,怎樣才能糾正?

+0

請嘗試格式化你的問題和代碼更好一點 – 2009-04-18 17:58:16

回答

1

class聲明的默認可見性是私人的。因此,無論PlayerPlayerFactory類的所有成員函數都是private - 不是由客戶端訪問。你需要讓它們公開。

Player.h

#ifndef PLAYER_H 
#define PLAYER_H 
class Player 
{ 
public: 
    virtual ~Player() { 
     cout << "Player destructor called" << endl; 

    } 
    virtual void Player::PlayerMakeMove(){ 
     cout << "make move" << endl; 
    } 


}; 
#endif // PLAYER_H 

PlayerFactory.h

#ifndef PLAYERFACTORY_H 
#define PLAYERFACTORY_H 
class PlayerFactory 
{ 
public: 
    virtual ~PlayerFactory() { 
     cout << "PlayerFactory destructor called" << endl; 
    } 

    virtual std::auto_ptr<Player> PlayerFactory::MakePlayerX() const{ 

     return PlayerFactory::MakePlayer('x'); 
    } 

    virtual std::auto_ptr<Player> PlayerFactory::MakePlayerO() const{ 
     return PlayerFactory::MakePlayer('o'); 

    } 

    std::auto_ptr<Player> PlayerFactory::MakePlayer (char letter) const{ 
     auto_ptr<Player> pt(new Player()); 
     return pt; 
    } 
}; 
#endif // PLAYERFACTORY_H 

此外,Game::Play()缺乏return聲明。

Outcome Game::Play() { 
    cout << " play" << endl; 
    return PlayerXWon; 
} 

請根據需要添加所需的標題,轉發聲明和using聲明(我在此處跳過)。

+0

未進行具體。也就是說,這是一個託管make項目。這是我需要做的事嗎?如果是這樣,任何想法如何?謝謝。 – 2009-04-18 15:09:39

1

好,無論出於何種原因,鏈接器沒有找到構造函數,它有力地表明,它不會編譯執行 。

幾個調試步驟:

  • 試圖找到得到由GCC生成的.obj文件。看看你是否可以在其中找到Game.obj 。

  • 找到一個辦法讓IDE輸出它生成的gcc

  • 如果沒有直接的方法在命令行中,總有:

    • 做一個腳本,用它取代GCC,並使腳本將命令行 寫入文件並檢查它。