2013-08-22 10 views
5

Ich bin unten mit dieser Funktion Problemen mit:illegal Aufruf von nicht-statischer Member-Funktion

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

Erklärung:

char* GetPlayerNameEx(int playerid); 

Nutzung:

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

Nun mein Problem hier ist

Persönliche Informationen entfernt n.

Wenn dies etwas zu tun hat, was ich bezweifle, ist diese Funktion in einem "Class" Header (Deklaration) enthalten.

Auch ich habe keine Ahnung warum, aber ich kann nicht die "Code" Box richtig überpassen.

+1

Sie haben [undefiniertes Verhalten] (http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) . Ich würde sowieso eine 'std :: string 'zurückgeben. – chris

+0

Ist die Funktion GetPlayerNameEx im CPlayer-Namespace deklariert oder ist CPlayer der Klassenname? – Amadeus

+1

@chris: Laut dem Compiler ist das OP-Programm in Wirklichkeit schlecht formuliert. Damit ein undefiniertes Verhalten auftritt, muss es zuerst kompiliert und ausgeführt werden. –

Antwort

4

Sie können diese Funktionen als statisch nicht schaffen (ohne viel Zwicken), weil Sie die Daten einer bestimmten Instanz zu ändern versuchen. Um dies zu beheben Ihr Problem:

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

Das entfernt den statischen Fehler, aber gibt mir Konversationsfehler. Ich bin mir sicher, dass ich zwicken und damit arbeiten kann. Danke: D. – user1591117

+1

Sie geben immer noch einen Zeiger auf ein lokales Array zurück. –

+0

Okay ungeprüft aber ich habe das funktioniert dank dem Code, den Sie gepostet haben; Danke für deine und alle helfen hier. : D – user1591117

2
CPlayer::GetPlayerNameEx(playerid) 

Sie können nicht den Umfang (::) Operator für eine Klasse-Typ verwenden, um eine Funktion aufzurufen, wenn es eine statische Funktion ist. Um eine Funktion für ein Objekt aufzurufen, müssen Sie zuerst den Speicher für dieses Objekt erstellen (indem Sie eine CPlayer-Variable irgendwo einfügen) und dann die Funktion für dieses Objekt aufrufen.

Statische Funktionen sind global und speziell nicht mit Member-Variablen der Klasse (außer sie sind auch statisch), was sie gültig macht, ohne den Bereich einer tatsächlichen Objektinstanz aufzurufen.

+0

Ja, wenn -> das Objekt referenziert, können Sie das nicht für einen Klassentyp tun, Sie müssen das Objekt tatsächlich zuerst machen. 'CPlayer * myPlayer = neuer CPlayer; myPlayer-> GetPlayerNameEx (playerid); 'würde funktionieren, aber es klingt für mich so, dass diese Funktion nur statisch sein sollte, da es sich nicht wirklich interessiert, welcher Player sie aufruft. – Lochemage

+0

@Lochemage, außer es würde unnötigerweise Zeiger verwenden. – chris

+0

@Lochmage: Das ist genau das, was ich nicht verstehe, da keine playerid ich es eingeben sollte es verarbeiten. Würde ich dies global beleuchten, wenn ich das gerne mache? Allerdings würde es dann eine Neudefinition des Codes erfordern. – user1591117

5

Illegaler Aufruf der nicht statischen Elementfunktion bedeutet, dass Sie versuchen, die Funktion aufzurufen, ohne ein Objekt der Klasse zu verwenden, die die Funktion enthält.

Die Lösung sollte sein, die Funktion zu einer statischen Funktion zu machen.

Dies ist in der Regel, was den Fehler verursacht C2352:

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

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

Wenn es statisch zu machen für Sie keine Option ist, dann haben Sie eine Instanz der Klasse CPlayer zu erstellen.

So:

CPlayer myPlayer; 
myPlayer.GetPlayerNameEx(playerid); 
+0

Der Bereichsoperator wird verwendet, wenn Sie eine statische Funktion aufrufen müssen, also hat das OP diese Funktion als statisch deklariert. – Banex

+0

Banex deklariert als statisch entschieden, die gleichen Fehler zurückzugeben, weshalb ich verwirrt bin. Auch die -> Fundtion gibt ähnliche Fehler zurück. Wenn ich :: verwende, erscheint die Funktion im Drop-down-Menü. – user1591117

+0

@ user1591117 Achten Sie darauf, das Schlüsselwort static nur in die Kopfzeile einzufügen, in der sich die Klassendeklaration befindet. – Banex

Verwandte Themen