1. ホーム
  2. c++

[解決済み] 非静的メンバ関数の不正な呼び出し

2022-02-10 11:57:01

質問内容

以下のような関数で困っています。

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) の中に含まれています。

また、なぜかわからないのですが、"Code" のボックスが正しくはまりません。

解決方法は?

特定のインスタンスのデータを変更しようとしているため、これらの関数を静的なものとして作成することはできません(多くの微調整を行わずに)。 あなたの問題を解決するには

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