2010-10-29 12 views
10

Tengo una aplicación que es una mezcla de C++ y objetivo-c.c + + clase con objetivo-c amigo

Muchas de las clases de C++ existen simplemente como fachadas para acceder al objeto objetivo-c subyacente del resto de la aplicación x ++.

Mi problema es uno de diseño: la clase objetivo-c necesita volver a llamar a la clase C++ a través de un conjunto de métodos que prefiero marcar como privados; ninguna otra clase C++ (ni siquiera clases derivadas) necesita estar jugando con estos.

Pero no puedo marcarlos como privados, ya que no parece haber una manera de hacer que los métodos de la clase objetivo sean 'amigos' de una clase de C++.

Consideré hacer trampa y usar macros para marcar los métodos de C++ como públicos cuando se define __OBJC__, pero eso cambia la decoración del método y daría lugar a errores de enlace.

¿Alguien más ha encontrado esto?

// MyView.mm 
@interface MyView : NSView { 
@public 
    CMyView* _cpp; 
} 

-(void)drawRect:(NSRect)dirtyRect { 
    CGContextRef cgc = (CGContextRef)[[NSGraphicsContext currentContext]graphicsPort]; 
    _cpp->Draw(cgc); 
} 
... 

// MyView.h 
class CMyView { 
    id _view; 
public: 
    // this method should be private. It exists ONLY for the MyView obj-c class. 
    void OnPaint(CGContextRef cdc); 
}; 

Respuesta

7

Si tiene que hacer eso, puede ajustar su clase Obj-C en un objeto C++ que se envía a CMyView. Necesitarás otro nivel de abstracción entre las dos clases que ya tienes.

+3

lol. una clase de contenedor para envolver mi clase de wapper. –

+2

Sí, esa es la alegría de Obj-C++ –

+0

Eso es el desarrollo de software moderno, escribiendo capas y envolturas – Lothar

Cuestiones relacionadas