С++ класс с objective-c другом

У меня есть приложение, представляющее собой сочетание С++ и objective-c.

Довольно много классов С++ существуют просто как фасады для доступа к базовому объекту objective-c из остальной части приложения x ++.

Моя проблема - одна из задач: класс objective-c должен перезванивать в класс С++ с помощью набора методов, которые я бы предпочел отмечать как private - никакой другой класс С++ (даже не производные классы) должен быть возиться с ними.

Но я не могу пометить их как private, так как не существует способа сделать objective-c методы класса "друзьями" класса С++.

Я рассмотрел обман и использование макроса, чтобы пометить методы С++ как общедоступные, когда __OBJC__ определен, но это изменяет оформление метода и приведет к ошибкам ссылок.

кто-нибудь еще столкнулся с этим?

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

Ответ 1

Если вы должны это сделать, вы можете обернуть свой класс Obj-C в объект С++, который будет дружественным CMyView. Вам понадобится еще один уровень абстракции между двумя уже существующими вами классами.