C ++ / Eclipse未定义的引用问题

时间:2009-04-18 15:03:27

标签: c++ linker

我遇到了Eclipse / C ++中显然是链接器错误(“未定义的引用”)的问题。下面显示的所有类都编译正常,除了一个PlayGame.cpp,它给出了“未定义的引用”错误(也在下面显示)。

以下是相关的类和代码段。

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
      ...

上面的行给出了错误“对游戏的未定义引用(PlayerFactory const&amp;)'”

导致此错误的原因是什么,以及如何纠正?

2 个答案:

答案 0 :(得分: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语句(我在此处跳过它们)。

答案 1 :(得分:1)

嗯,无论出于何种原因,链接器都找不到实现 构造函数,强烈暗示它不会被编译。

一些调试步骤:

  • 尝试查找由gcc生成的.obj文件。看看你是否能找到Game.obj 其中。

  • 找到一种让IDE输出为gcc生成的命令行的方法

  • 如果没有直截了当的方式,总会有:

    • 创建一个脚本,用它替换gcc,然后让脚本编写命令行 进入文件并检查它。