c++ LNK2001: unresolved external symbol problem

Joey Roosing picture Joey Roosing · Apr 13, 2011 · Viewed 37.2k times · Source

Greetings.

I have searched for a solution, but I think this problem is personal code specific, hence my posting here.

I'll get straight to the point.

In my main I have two objects.

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

In the computer class, in the header I have the following:

  private:

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

Then in 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;
    }
}

At this point I think the problem arises.

The methods called from the class Strategy all require knowledge of the board thus:

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

The problems im getting, unabling them to compile:

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

As a c++ noob, I have absolutely no clue why or how this problem is caused. I think it has to do something with either the instantiation of Strategy in the computer class, or with the parameter given from computer to the strategy in the method calls.

Can anyone explain WHY this error is occuring, I don't quite understand the error at all. And also how to solve/prevent this?

EDIT*

I just got a request to share the Strategy class:

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]);
};

The class defined these methods, I won't post them because they are quite long.

Answer

molbdnilo picture molbdnilo · Apr 13, 2011

This is a linking error and it has nothing to do with instantiations or parameters.

You haven't provided the linker with the definitions for those functions. If you defined them in Strategy.cpp you need to compile that and add it as an argument to the linker. How you do that depends entirely on what tools you're using to build your program.
If you're using Visual Studio (or any other IDE) it should take care of it automatically once you've added Strategy.cpp to your project.

Or did you perhaps define them like this:

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

instead of like this:

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

The first one doesn't define a Strategy member function, it defines a global function.