【问题标题】:Objects in Array C++ issue数组 C++ 中的对象问题
【发布时间】:2013-01-18 04:04:20
【问题描述】:

我正在制作一个包含 Player 类的简单游戏,并制作了一个数组来在玩家被实例化时保存他们。问题是,每次运行程序时,我都会收到 LNK 2019 错误-“未解析的外部符号”。我不确定为什么会发生这种情况或如何使其正常工作。任何帮助将不胜感激。

Player *player = new Player[9];
for(int i = 0; i< world1.numPlayers;i++) // ADD PLAYERS TO ARRAY
{
    Player tempplayer(3,3,5,1);
    player[i] = tempplayer;

}

这是播放器类的定义:

#pragma once
class Player
{
public:
Player(int width, int height, int xPos, int health );
~Player(void);
Player();
int getWidth();
int getHeight();
int getHealth();
int getPos();
void setHealth(int newHealth);
bool isAlive();
int width;
int height;
int health;
int xPos;

    };

这是确切的警告:“错误 1 ​​错误 LNK2019:无法解析的外部符号“public: __thiscall Player::Player(void)”(??0Player@@QAE@XZ) 在函数 _main C:\Users\Alex 中引用\Documents\Visual Studio 2012\Projects\ConsoleApplication2\ConsoleApplication2\World.obj ConsoleApplicati‌​on2"

【问题讨论】:

  • 您是否为每个成员函数(尤其是析构函数)提供了定义?
  • 链接器警告通常会显示它无法找到的内容。这通常足以确定错误的来源,或者至少指出正确的方向。你能粘贴完整的警告吗?

标签: c++


【解决方案1】:

你的数组循环没问题。

问题是您没有在.cpp 文件中定义您在@ 中声明 的一个或多个类成员函数987654322@文件。

我们无法分辨是哪一个,因为您没有显示整个错误,但请确保它们都是定义的,即使只有空定义。

一个常见的罪魁祸首是析构函数;当你不需要它做任何事情时,很容易忘记定义它:

Player::~Player()
{
}

它也可能是你的默认构造函数:

Player::Player()
{
}

全部定义!

【讨论】:

    【解决方案2】:

    Martin 是正确的,您需要为该数组分配指针。我原以为这样的错误会给你编译时警告。

    到链接器错误 - 链接器警告通常会打印它无法找到的内容。这通常足以确定错误的来源,或者至少指出正确的方向。你能粘贴完整的警告吗?

    通常链接时间错误是未定义的成员函数的结果,如 dreamlax 的评论中所述,或者未能包含其中一个库。

    【讨论】:

    • Martin is right that you need to assign pointers to that array. I would have thought that such an error would have given you compile time warnings.数组和他的使用绝对没问题。
    • 这里是确切的警告:“错误 1 ​​错误 LNK2019:无法解析的外部符号“公共:__thiscall Player::Player(void)”(??0Player@@QAE@XZ) 在函数 _main C 中引用:\Users\Alex\Documents\Visual Studio 2012\Projects\ConsoleApplication2\ConsoleApplication2\World.obj ConsoleApplication2"
    【解决方案3】:

    你使用类指针、实例和构造函数似乎有点不对劲。

    你的代码应该是这样的:

    Player *player[9];
    
    for(int i = 0; i< world1.numPlayers;i++) // ADD PLAYERS TO ARRAY
    {
    
        player[i] = new Player(3,3,5,1);
    
    }
    

    编辑:请注意,这只会绕过导致原始链接错误的原因。链接器抱怨找不到默认构造函数Player::Player(void)。如果我没记错的话,它会在您使用new Player[9] 创建数组时被调用。声明它应该可以解决这个错误,允许您继续使用原始代码而不是我的版本。

    【讨论】:

    • 1) player 在此处未初始化。 2) 如果new Player 抛出,这将泄漏。
    • 忘记将索引添加到数组中,抱歉。是的,如果构造函数抛出,它会泄漏之前的元素。
    • @MartínValdésdeLeón:原来的循环很好;你的添加了 criticalshow-stopping 错误。
    • @MartínValdésdeLeón,谢谢,这解决了我遇到的问题。如果我要从数组中引用一个 Player 对象,例如在 player[0] 上使用 getHealth() 方法,那么以下内容是否正确?播放器[0].getHealth();
    • 没有。 player[0] 将是 Player *,因此您必须使用 player[0]-&gt;getHealth();(*player[0]).getHealth();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多