2010-07-21 4 views
14

Я снова очищаю и получаю сообщение об ошибке:Невозможно вызвать функцию-член без объекта = C++

Невозможно вызвать функцию-член без объекта.

Я звоню как:

FxString text = table.GetEntry(obj->GetAlertTextID()); 
FxUChar outDescription1[ kCP_DEFAULT_STRING_LENGTH ]; 

IC_Utility::CP_StringToPString(text, &outDescription1[0]); 

Линия: IC_Utility :: CP_StringToPString (текст, & outDescription1 [0]); получаете ошибку

Моей функции является:

void IC_Utility::CP_StringToPString(FxString& inString, FxUChar *outString) 
{ 
} 

Я знаю, что это должно быть что-то простое, мне не хватает.

ответ

21

Если вы написали функцию CP_StringToPString, вы должны объявить его static:

static void IC_Utility::CP_StringToPString(FxString& inString, FxUChar *outString) 

В качестве альтернативы, если это функция в стороннем коде, вы должны объявить IC_Utility объект для вызова его на :

IC_Utility u; 
u.CP_StringToPString(text, &outDescription1[0]); 
1

В декларации вашего класса вам необходимо объявить функцию static. например

class IC_Utility { 
    // ... 

    static void CP_StringToPString(FxString& inString, FxUChar *outString); 

    // ... 
}; 
+0

Объявление статично, поскольку я не создаю объект сначала, как IC_Utility u; u.xxx(); и т.д? У вас есть ссылка на что-то, что я мог бы прочитать? – jDOG

+0

Вот что можно прочитать: http://www.ehow.com/how_2189209_declare-static-functions-c.html Но это действительно довольно простая особенность C++. Вы можете просто подобрать хорошую книгу/учебник на C++. –

10

Ваш метод не является статичным, и поэтому его нужно вызывать из экземпляра (вроде того, как говорит ошибка). Если ваш метод не требует доступа к каким-либо другим переменным или методам экземпляра, вы, вероятно, просто хотите объявить его static. В противном случае вам нужно будет получить правильный экземпляр и выполнить метод в этом экземпляре.

3

Вы должны объявить функцию с 'статическим' ключевым словом:

class IC_Utility { 
    static void CP_StringToPString(FxString& inString, FxUChar *outString); 
-2

«статический» - это правильный ответ. или, вы можете передать ему NULL «этот» указатель, если он не используется в функции:

((IC_Utility*)NULL)->CP_StringToPString(...); 
+1

[Приводит к неопределенному поведению] (http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav), дон Не делай этого. – GManNickG

+0

@GMman, если он может быть сделан статическим, тогда не будет никакого неопределенного поведения, когда он будет вызван таким образом. Покажите мне хотя бы один разборный список, который доказывает, что я ошибаюсь. – ruslik

+1

Что происходит при разборке? На языке * C++ это приводит к неопределенному поведению. Определенный вывод некоторых реализаций при определенных условиях не имеет ничего общего с C++. – GManNickG

Смежные вопросы