我遇到了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;)'”
导致此错误的原因是什么,以及如何纠正?
答案 0 :(得分:1)
class
声明的默认可见性是私有的。因此,Player
和PlayerFactory
类的所有成员函数都是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生成的命令行的方法
如果没有直截了当的方式,总会有: