C++ c++;LNK2001:未解决的外部符号问题

C++ c++;LNK2001:未解决的外部符号问题,c++,lnk,C++,Lnk,你好 我已经寻找了一个解决方案,但我认为这个问题是个人代码特定的,因此我在这里发布 我会直截了当地说 我主要有两个目标 Computer *computer = new Computer(); Player *player = new Player(); 在计算机类中,在标题中我有以下内容: private: Strategy *strategy; int winningPosition; int twoInRow; int counter; int makeTwo; 然后在Compu

你好

我已经寻找了一个解决方案,但我认为这个问题是个人代码特定的,因此我在这里发布

我会直截了当地说

我主要有两个目标

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;
    }
}
在这一点上,我认为问题出现了

从课堂策略中调用的方法都需要董事会的知识,因此:

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
作为一个C++ NoOB,我完全不知道这个问题的原因和原因。我认为它要么与计算机类中策略的实例化有关,要么与方法调用中从计算机向策略提供的参数有关

谁能解释一下为什么会发生这个错误,我一点也不理解这个错误。 以及如何解决/预防这一问题

编辑*

我刚收到一个分享策略课程的请求:

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

类定义了这些方法,我不会发布它们,因为它们很长。

错误只是说明您已声明但未定义成员函数
Strategy::makeTwo
Strategy::counter
Strategy::checkTwoInRow
。是否确实实现了它们(在实际编译的源文件中),并且没有意外地将它们定义为自由函数?

错误只是说明您已声明但未定义成员函数
Strategy::makeTwo
Strategy::counter
,和
策略::checkTwoInRow
。是否确实实现了它们(在实际正在编译的源文件中),并且没有意外地将它们定义为自由函数?

这是一个链接错误,与实例化或参数无关

您尚未向链接器提供这些函数的定义。如果在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
}
而不是像这样:

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
}

第一个没有定义策略成员函数,它定义了一个全局函数。

这是一个链接错误,与实例化或参数无关

您尚未向链接器提供这些函数的定义。如果在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
}
而不是像这样:

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
}

第一个不是定义一个策略成员函数,而是定义一个全局函数。

向我们展示策略类及其后代,我想这就是你的问题所在。@Tony会这样做的。谢谢你的通知。我也试过将“pragma”改为“ifndef STRATEGY”和“define STRATEGY”(虽然我还不太明白,这只是我在其他标题中使用的内容),但它没有改变任何东西。给我们看一下STRATEGY类和它的后代,我想这就是你的问题所在。@Tony会的。谢谢你的通知。我也尝试过将pragma改为ifndef STRATEGY和define STRATEGY(虽然我还不太明白,这只是我在其他标题中使用的),但没有任何改变。实际上,我在标题中根本没有定义它们。需要在计算机标题中定义Strategy::counter吗?@Joey Roosing:确保您理解声明和定义之间的区别。您在最初的问题中展示了它们的声明(可能是从
类Strategy
中摘录的),但是这些成员函数实际实现在哪里?它们在Strategy类中实现,并且所有三个都返回一个整数。是的,你是对的。我混淆了定义和声明。很抱歉。这些方法是在Strategy类中定义和声明的,我需要在computer类中访问它们实际上,我根本没有在header中定义它们。需要在计算机标题中定义Strategy::counter吗?@Joey Roosing:确保您理解声明和定义之间的区别。您在最初的问题中展示了它们的声明(可能是从
类Strategy
中摘录的),但是这些成员函数实际实现在哪里?它们在Strategy类中实现,并且所有三个都返回一个整数。是的,你是对的。我混淆了定义和声明。很抱歉。这些方法是在Strategy类中定义和声明的,我需要在computer classI中访问它们,我使用第二个版本定义它们:Strategy::checkTwoInRow。谢谢你的解释。问题很清楚:)谢谢你。如果你不介意的话,我想再问你一件事。这就是ifndef和define的作用吗?好的,我们刚刚发现了问题。我很笨,我确实用了你的第一个版本。忘记使用策略::。。。即使是在beign之后,我也相信,因为我总是在类文件上这样做。。。但这次我完全忘记了。非常感谢。@Joey Roosing:这就是我所说的“意外地将它们定义为自由函数”。:-]我使用第二个版本定义了它们:Strategy::checkTwoInRow。谢谢你的解释。问题很清楚:)谢谢你。如果你不介意的话,我想再问你一件事。这就是ifndef和define的作用吗?好的,我们刚刚发现了问题。我被解雇了