非法调用非静态成员函数

use*_*117 6 c++ visual-c++

我在下面的这个功能有问题:

char* GetPlayerNameEx(int playerid)
{

    char Name[MAX_PLAYER_NAME], i = 0;

    GetPlayerName(playerid, Name, sizeof(Name));

    std::string pName (Name);

    while(i == 0 || i != pName.npos)
    {
        if(i != 0) i++;
        int Underscore = pName.find("_", i);
        Name[Underscore] = ' ';
    }
    return Name;
}
Run Code Online (Sandbox Code Playgroud)

宣言:

char* GetPlayerNameEx(int playerid);
Run Code Online (Sandbox Code Playgroud)

用法:

sprintf(string, "%s", CPlayer::GetPlayerNameEx(playerid));
Run Code Online (Sandbox Code Playgroud)

现在我的问题是

删除了个人信息.

如果这与我怀疑它有什么关系,那么这个函数包含在"Class"头(Declartion)中.

此外,我不知道为什么,但我不能让"代码"框正确适合.

Jid*_*dle 8

非静态成员函数的非法调用意味着您试图在不使用包含该函数的类的对象的情况下调用该函数.

解决方案应该是使函数成为静态函数.

这通常是导致错误C2352的原因:

class MyClass {
    public:
        void MyFunc() {}
        static void MyFunc2() {}
};

int main() {
    MyClass::MyFunc();   // C2352
    MyClass::MyFunc2();   // OK
}
Run Code Online (Sandbox Code Playgroud)

如果将它设为静态不适合您,则必须创建CPlayer类的实例.

像这样:

CPlayer myPlayer;
myPlayer.GetPlayerNameEx(playerid);
Run Code Online (Sandbox Code Playgroud)


Zac*_*and 5

您不能将这些函数创建为静态(无需大量调整),因为您正在尝试修改特定实例的数据。要解决您的问题:

class CPlayer
{
public:
    // public members

    // since you are operating on class member data, you cannot declare these as static
    // if you wanted to declare them as static, you would need some way of getting an actual instance of CPlayer
    char* GetPlayerNameEx(int playerId);
    char* GetPlayerName(int playerId, char* name, int size);
private:
    // note:  using a std::string would be better
    char m_Name[MAX_PLAYER_NAME];
};

// note:  returning a string would be better here
char* CPlayer::GetPlayerNameEx(int playerId)
{
    char* Name = new char[MAX_PLAYER_NAME];
    memset(Name, MAX_PLAYER_NAME, 0);
    GetPlayerName(playerId, m_Name, sizeof(m_Name));
    std::string sName(m_Name);
    std::replace(sName.begin(), sName.end(), '_', ' ');
    ::strncpy(sName.c_str(), Name, MAX_PLAYER_NAME);
    return Name;
}
// in your usage
CPlayer player;
// ...
sprintf(string, "%s", player.GetPlayerNameEx(playerid));
Run Code Online (Sandbox Code Playgroud)