Проблема с добавлением объектов C ++ в коллекции Objective C (NSSet) - PullRequest
0 голосов
/ 20 октября 2011

Я занят внедрением ZXing с QRCodeReader в мой проект.QRCodeReader - это в основном C ++ и цель моего проекта - C.Мне удалось реализовать его должным образом, чтобы я мог использовать объекты QRCodeReader в моей реализации target-C (файл .mm).Но теперь мне нужно передать этот объект C ++ в свойство zxWidController.reader.

Это означает, что мне придется установить объект C ++ в объект NSSet.

QRCodeReader* qrcodeReader = new QRCodeReader();
NSSet *readers = [[NSSet alloc ] init];
[readers setByAddingObject:(id)qrcodeReader];
widController.readers = readers;
[readers release];

Приведенный выше код делаеттрюк.Я преобразовал объект C ++ в (id) и теперь он правильно компилируется.Но это правильный способ сделать это?

Является ли этот способ программирования правильным способом сделать это?

Существуют ли другие / лучшие способы достижения моей цели?

Ответы [ 2 ]

3 голосов
/ 20 октября 2011

Тип C ++ не является типом Objective C. Вы не можете отправлять ему сообщения, в частности сохранять и освобождать, что делает NSSet. Существует тип Objective C с тем же именем, который вы хотите использовать. (Я обновлю свой другой ответ).

1 голос
/ 20 октября 2011

Код выше делает свое дело. Я бросил объект C ++ в (id) и теперь он компилируется правильно. Но так ли это правильно?

Нет. Вы не можете просто сделать произвольный указатель на действительный указатель объекта Objective C, приведя его к id.

Является ли этот способ программирования правильным способом сделать это?

Опять же, нет.

Есть ли другие / лучшие способы достижения моей цели?

Вы можете попробовать любое из следующего:

  • Переопределите ваш класс zxWidController, чтобы получить указатель на объект C ++ вместо объекта Obj-C.

  • Обернуть qrcodeReader в NSValue.

  • Взгляните на NSPointerArray как замену NSSet. Обязательно прочитайте документы, прежде чем пытаться их использовать - вы должны настроить политики управления памятью так, чтобы они правильно подходили для типа сохраняемого указателя.

Незначительный придирка: на мгновение забыв о том факте, что qrcodeReader указывает на объект C ++, кажется глупым создавать пустой набор только для того, чтобы вы могли добавить к нему объект. Если вы собираетесь использовать набор Obj-C, то создайте его с помощью + setWithObject: или используйте вместо этого NSMutableSet.

...