C ++ / Eclipse неопределенный справочный вопрос - PullRequest
0 голосов
/ 18 апреля 2009

У меня проблемы с тем, что, по-видимому, является ошибкой компоновщика («неопределенная ссылка») в 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
      ...

В приведенной выше строке выдается ошибка "неопределенная ссылка на` Game (PlayerFactory const &) '"

В чем причина этой ошибки и как ее можно исправить?

Ответы [ 2 ]

1 голос
/ 18 апреля 2009

Ну, по какой-то причине, компоновщик не находит реализацию конструктора, который настоятельно рекомендует не компилироваться.

Несколько шагов отладки:

  • попытайтесь найти файлы .obj, сгенерированные gcc. Посмотрите, сможете ли вы найти Game.obj среди них.

  • Найдите способ получить IDE для вывода командной строки, сгенерированной для gcc

  • если нет прямого пути, всегда есть:

    • Создайте скрипт, замените его gcc и заставьте скрипт написать командную строку в файл и изучите это.
1 голос
/ 18 апреля 2009

Видимость по умолчанию для объявлений 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 операторы по мере необходимости (я их здесь пропускаю).

...