非法调用非静态成员函数

时间:2013-08-22 00:49:15

标签: 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;
}

声明:

char* GetPlayerNameEx(int playerid);

用法:

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

现在我的问题是

删除了个人信息。

如果这与我怀疑它有什么关系,那么这个函数包含在“Class”标题中(Declartion)。

此外,我不知道为什么,但我无法正确填写“代码”框。

3 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

像这样:

CPlayer myPlayer;
myPlayer.GetPlayerNameEx(playerid);

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

CPlayer::GetPlayerNameEx(playerid)

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

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