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 に答える
2
CPlayer::GetPlayerNameEx(playerid)

::静的関数でない限り、クラス型でスコープ ( ) 演算子を使用して関数を呼び出すことはできません。オブジェクトで関数を呼び出すには、実際には最初にそのオブジェクトのメモリを作成し (CPlayerどこかに変数を作成して)、次にそのオブジェクトで関数を呼び出す必要があります。

静的関数はグローバルであり、具体的にはクラスのメンバー変数をいじることはありません (それらが静的でない限り)。これにより、実際のオブジェクト インスタンスのスコープなしで呼び出すことができます。

于 2013-08-22T00:54:43.190 に答える