8

我在使用以下功能时遇到问题:

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

宣言:

char* GetPlayerNameEx(int playerid);

用法:

sprintf(string, "%s", CPlayer::GetPlayerNameEx(playerid));

现在我的问题是

删除了个人信息。

如果这与我怀疑它有什么关系,则此函数包含在“类”标头(声明)中。

我也不知道为什么,但我无法让“代码”框正确安装。

4

3 回答 3

11

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

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

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

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

int main() {
    MyClass::MyFunc();   // C2352
    MyClass::MyFunc2();   // OK
}

如果将其设为静态不是您的选择,那么您必须创建 CPlayer 类的实例。

像这样:

CPlayer myPlayer;
myPlayer.GetPlayerNameEx(playerid);
于 2013-08-22T00:56:52.203 回答
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));
于 2013-08-22T01:16:44.407 回答
2
CPlayer::GetPlayerNameEx(playerid)

除非它是静态函数,否则不能在类类型上使用范围 ( ::) 运算符来调用函数。要在对象上调用函数,您实际上必须首先为该对象创建内存(通过在CPlayer某处创建变量)然后在该对象上调用该函数。

静态函数是全局的,特别是不会与类的成员变量混淆(除非它们也是静态的),这使得它们可以在没有实际对象实例范围的情况下有效调用。

于 2013-08-22T00:54:43.190 回答