Versión corta: Tengo un Qt/C++ al que tengo que agregar una cantidad limitada de código Cocoa/Objective-C. Cambié el archivo .cpp a un archivo .mm y agregué el código/objetos objetivo-c a dicho archivo, y se compila y funciona. Ahora necesito un delegado para uno de los objetos que creé, un NSPopUpButton (o, más bien, el menú del mismo) para ser exactos, y estoy atascado. ¿Cómo puedo agregar un delegado para este objeto?¿Cómo manejar la delegación de Object-c de C++?
Detalles: archivos en cuestión:
reportwindow.h, reportwindow.cpp renombrado a reportwindow.mm -Estos son los archivos que contienen mi original C++ aplicación, además de algo de código Objective-C (abrir una NSSavePanel que contiene una NSPopUpButton). reportwindow.h también se incluye en un archivo .cpp, si eso hace la diferencia.
menuHandler.h, menuHandler.mm archivos contienen una -estos (VACIO) Clase de Objective-C que tenía la intención de utilizar como delegado
Mi primer pensamiento fue que yo podría simplemente hacer que la clase de C++ el delegado, pero obviamente esto no funciona, ya que C++ no comprende la delegación. Luego pensé en crear una clase object-c separada como NSMenuDelegate y agregar una instancia de ella como objeto miembro a mi clase C++. Como pude agregar otros objetos Object-C como miembros, pensé que esto debería funcionar. Sin embargo, tan pronto como incluí el encabezado para mi nueva clase object-c en el archivo de encabezado de clase C++, recibí varios cientos de errores sobre "id-esperado no esperado antes de '@' token" -de los archivos de encabezado de apple (NSValue.h , NSObject.h, etc.) Entonces, aparentemente, eso no funcionó, al menos no como está. Obtengo el mismo resultado al incluir CUALQUIER cabecera de cacao en el archivo de encabezado de mi clase.
Entonces pensé en intentar una declaración directa de la clase objetivo-c (así es como obtuve el funcionamiento de los otros objetos object-c). sin embargo, esto tampoco funcionó: si lo declaro como "clase myClassName", aparece un error sobre la redefinición de la clase como un tipo diferente de símbolo (presumiblemente clase c + + vs protocolo objetivo-c). Si intento reenviarlo, lo declaro como @protocol myClassName, me sale un error sobre "esperado ID no calificado antes de '@' token". Entonces, ¿cómo puedo hacer que esto funcione?
¿Ha cambiado el nombre de ese archivo CPP específico para mm? –
El asociado con el encabezado en cuestión, sí. – ibrewster
La segunda forma es el camino a seguir, y probablemente el único. No deberías rendirte después del primer intento fallido. Proporcione más detalles, lo que incluye qué, puede haber solo más archivos .cpp que incluyen 'reportwindow.h'. – hamstergene