c ++ LNK2001: нерешенная проблема с внешними символами - PullRequest
1 голос
/ 13 апреля 2011

Привет.

Я искал решение, но думаю, что эта проблема связана с личным кодом, поэтому я размещаю здесь сообщение.

Я сразу перейду к делу.

В моем главном есть два объекта.

Computer *computer = new Computer();
Player *player = new Player();

В компьютерном классе, в шапке у меня следующее:

  private:

Strategy *strategy;
int winningPosition;
int twoInRow;
int counter;
int makeTwo;

Затем в Computer.cpp:

Computer::Computer(char token, bool hasTurn)
{
    m_token = token;
    m_hasTurn = hasTurn;
    strategy = new Strategy();
}

int Computer::getMove(const char (&board)[9])
{
    twoInRow = strategy->checkTwoInRow(board);
    counter = strategy->counter(board);
    makeTwo = strategy->makeTwo(board);

    if(twoInRow != 0)
    {
        return twoInRow - 1;
    } else if(counter != 0) {
        return counter - 1;
    } else if(makeTwo != 0) {
        return makeTwo - 1;
    } else {
        return 0;
    }
}

На данный момент я думаю, что проблема возникает.

Все методы, вызываемые из класса Strategy, требуют знания доски:

int checkTwoInRow(const char (&board)[9]);
int counter(const char (&board)[9]);
int makeTwo(const char (&board)[9]);

Проблемы, которые я получаю, не позволяя их скомпилировать:

Error   1   error LNK2019: unresolved external symbol "public: int __thiscall Strategy::makeTwo(char const (&)[9])" (?makeTwo@Strategy@@QAEHAAY08$$CBD@Z) referenced in function "public: int __thiscall Computer::getMove(char const (&)[9])" (?getMove@Computer@@QAEHAAY08$$CBD@Z)    C:\CPP\TTT\Computer.obj tictactoeCPP

Error   2   error LNK2019: unresolved external symbol "public: int __thiscall Strategy::counter(char const (&)[9])" (?counter@Strategy@@QAEHAAY08$$CBD@Z) referenced in function "public: int __thiscall Computer::getMove(char const (&)[9])" (?getMove@Computer@@QAEHAAY08$$CBD@Z)    C:\CPP\TTT\Computer.obj tictactoeCPP

Error   3   error LNK2019: unresolved external symbol "public: int __thiscall Strategy::checkTwoInRow(char const (&)[9])" (?checkTwoInRow@Strategy@@QAEHAAY08$$CBD@Z) referenced in function "public: int __thiscall Computer::getMove(char const (&)[9])" (?getMove@Computer@@QAEHAAY08$$CBD@Z)    C:\CPP\TTT\Computer.obj tictactoeCPP

Как нуб с ++, я понятия не имею, почему или как эта проблема вызвана. Я думаю, что это связано с созданием экземпляра Strategy в компьютерном классе или с параметром, передаваемым из компьютера стратегии в вызовах методов.

Может кто-нибудь объяснить, ПОЧЕМУ эта ошибка происходит, я совсем не понимаю ошибку. А также как решить / предотвратить это?

EDIT *

Я только что получил запрос на использование класса Стратегии:

Strategy.h:

    #pragma once
class Strategy
{
public:
    Strategy(void);
    ~Strategy(void);

    int checkTwoInRow(const char (&board)[9]);
    int counter(const char (&board)[9]);
    int makeTwo(const char (&board)[9]);
};

Класс определил эти методы, я не буду публиковать их, потому что они довольно длинные.

Ответы [ 2 ]

8 голосов
/ 13 апреля 2011

Это ошибка компоновки, и она не имеет ничего общего с экземплярами или параметрами.

Вы не предоставили компоновщику определения для этих функций.Если вы определили их в Strategy.cpp, вам нужно скомпилировать их и добавить в качестве аргумента компоновщику.То, как вы это сделаете, полностью зависит от того, какие инструменты вы используете для сборки своей программы.
Если вы используете Visual Studio (или любую другую IDE), он должен позаботиться об этом автоматически после того, как вы добавили Strategy.cpp вваш проект.

Или вы, возможно, определили их так:

int checkTwoInRow(const char (&board)[9])
{
   // Do something with board the wrong way
}

вместо этого:

int Strategy::checkTwoInRow(const char (&board)[9])
{
   // Do something with board the right way
}

Первый не определяет стратегиюфункция-член, она определяет глобальную функцию.

2 голосов
/ 13 апреля 2011

Ошибка просто говорит о том, что вы объявили, но не определили, функции-члены Strategy::makeTwo, Strategy::counter и Strategy::checkTwoInRow.Вы уверены, что реализовали их (в исходном файле, который фактически компилируется) и случайно не определили их как свободные функции?

...