2009-04-18 145 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,并使脚本将命令行 写入文件并检查它。