2010-05-05 3 views
0
void CVisualStudioDemoDoc::updateLine(void) 
{ 
int newln = GetLineNumber(p_buf); 
reinterpret_cast<CVisualStudioDemoView *>(m_viewList.GetHead())->SetCurrentLineNumber(ln, newln); 
ln = newln; 
} 

Я хочу вызвать эту функцию из другой части моего кода, не указывая указатель на объект и не включив заголовки.Вызов функции, которая использует объекты без предоставления объекта

Я хочу назвать это как нормальную функцию пустоты.

if (changementLigne == true) { 
     currentLine = prog; 
     // TODO : appeler le callback de X2 
     updateLine(); 
     Suspendre(); 
     changementLigne = false; 
    } 

Я не знаю, если это возможно, так как класс CVisualStudioDemoDoc является класс MFC, я не нашел указатель я могу использовать.

+0

Я знаю, но мне нужен способ сделать это, потому что я вызываю эту функцию из кода C – toto

+0

Что бы вы ожидали от такого звонка? Вся причина, по которой функция является функцией-членом, заключается в том, что она делает что-то для/с/для экземпляра. –

ответ

3

Вы не можете этого сделать.

Если функция-член ссылается на переменные-члены, ей нужен действительный указатель this. Если вы не включаете заголовочный файл, объявляющий функцию, компилятор не может знать, о чем вы говорите. Как он может знать, что updateLine() является функцией, если вы не сообщите об этом?

Если вы пытаетесь вызвать функцию-член C++ из кода C, вам нужно написать обертку. Что-то вроде следующего (не тестировался):

.h файл:

extern "C" { 
CallUpdateLine(void* data); 
} 

.cpp файл:

extern "C" { 
    CallUpdateLine(void* data) 
    { 
    CVisualStudioDemoDoc* ptr = static_cast<CVisualStudioDemoDoc*>(data); 
    ptr->updateLine(); 
    } 
} 

Есть другие questions, которые могут быть полезны, а также.

+0

Ну, похоже, мы думали об одном и том же, я тоже работал, используя функцию обертки. Проблема решена ИМО. – toto

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