1

这里又是一个菜鸟,所以我希望有一点理智的人可以帮助我!正如我的问题所述,我只是想创建一个玩家类(它用于 RPG 游戏)。但是,我尝试了多种方法来执行此操作,显示的代码是最新的,但是我不断遇到不同的错误。我正在使用 Microsoft Visual C++ 2010 Express,我目前面临的错误是:

1>player.obj:错误 LNK2001:未解析的外部符号“私有:静态类 std::basic_string,类 std::allocator > Player::m_playerName”(?m_playerName@Player@@0V?$basic_string@DU?$char_traits@ D@std@@V?$allocator@D@2@@std@@A)

我希望这是足够的细节!我创建的其余代码/文件如下:

游戏.cpp

#include <iostream>
#include "player.h"

using namespace std;



int main() 
{

    Player main;


   main.setStats(); 
   main.showStats();


    int stopper;
   cin >> stopper;

    return 0;



}

播放器.h

#include <string>

class Player
    {
    public:

        Player();
        void showStats();
        void setStats();        


    private: 

         int m_playerLVL;
         static std::string m_playerName;
    };

播放器.cpp

#include "player.h"
#include <iostream>
#include <string>

using namespace std; 

Player::Player()
{
    cout << "Please enter your name: ";
    string playerName;
    getline (cin, playerName);
    m_playerName = playerName;
}

    void Player::showStats()
    {
        cout << "Hello, i am " << m_playerName << "and i am lvl " << m_playerLVL; 
    }

    void Player::setStats()
    {
        m_playerLVL = 1;
    }
4

1 回答 1

1

您将播放器的名称声明为static

static std::string m_playerName; // DON'T MAKE IT STATIC!

这在语义上是不正确的,删除static​​恰好可以解决您的问题。每个实例都Player应该关联一个不同的值m_playerName(因为每个玩家都有自己的名字)。声明一个数据成员static使得它对整个Player类都是全局的(即它没有被赋予每个实例的值,而是一个对所有Player对象都相同的全局值)。这听起来不像你想要的。


现在,如果出于某种原因您真的打算将其声明为数据成员,那么您应该在全局命名空间范围内static为其提供定义:

std::string Player::m_playerName;

链接器抱怨缺少这样的定义。

于 2013-04-04T10:29:04.767 回答