所以,今天我很无聊,并决定搞乱C++/Obj-C插值,我找到了一种方法来创建一个非常有趣的设置.
@protocol NSCPPObj <NSObject>
-(id) init;
-(id) initWithInt:(int) value;
-(int) somethingThatReturnsAValue;
-(void) doSomething;
@end
class NSCPPObj : objc_object {
public:
static Class cls();
int iVar;
NSCPPObj();
NSCPPObj(int);
int somethingThatReturnsAValue();
void doSomething();
};
Run Code Online (Sandbox Code Playgroud)
如您所见,界面非常简单易懂.我们创建两个(几乎)相同的接口,一个用于C++对象,另一个用于Obj-C协议.
现在,我找到了一种方法来实现这一点,但是让自己好斗,这变得丑陋:
// NSCPPObj.mm
#import <objc/runtime.h>
#import <iostream>
#import "NSCPPObject.h"
Class NSCPPObj_class = nil;
__attribute__((constructor))
static void initialize()
{
NSCPPObj_class = objc_allocateClassPair([NSObject class], "NSCPPObj", 0);
class_addMethod(NSCPPObj_class->isa, @selector(alloc), imp_implementationWithBlock(^(id self) {
return class_createInstance(NSCPPObj_class, sizeof(struct NSCPPObj));
}), "@@:");
class_addMethod(NSCPPObj_class, @selector(init), imp_implementationWithBlock(^(id self) {
return self;
}), "@@:");
class_addMethod(NSCPPObj_class, @selector(initWithInt:), imp_implementationWithBlock(^(id …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中我需要显示选择文件对话框,我正在使用允许选择文件的NSOpenPanel,代码如下所示,
- (IBAction)sendFileButtonAction:(id)sender{
NSOpenPanel* openDlg = [NSOpenPanel openPanel];
// Enable the selection of files in the dialog.
[openDlg setCanChooseFiles:YES];
// Enable the selection of directories in the dialog.
[openDlg setCanChooseDirectories:YES];
// Display the dialog. If the OK button was pressed,
// process the files.
if ( [openDlg runModalForDirectory:nil file:nil] == NSOKButton )
{
// Get an array containing the full filenames of all
// files and directories selected.
NSArray* files = [openDlg filenames];
// Loop through all the files and …Run Code Online (Sandbox Code Playgroud) 我想在Objective-C中使用/重用C++对象.我有一个具有类定义的hello.h和用于类实现的hello.cpp.
class Hello
{ int getX() ... };
Run Code Online (Sandbox Code Playgroud)
我在Objective-C函数中使用这个类.
#include "hello.h"
...
- (IBAction) adderTwo:(id)sender
{
Hello *hi = new Hello();
int value = hi->getX();
NSLog(@"Hello %d", value);
[textField setIntValue:value];
Run Code Online (Sandbox Code Playgroud)
当我在Xcode中编译代码时,我收到此错误消息.
class Hello *XXXXX Users/smcho/Desktop/cocoa/adderTwo/hello.h:9:0 /Users/smcho/Desktop/cocoa/adderTwo/hello.h:9: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Hello'
什么地方出了错?
我正在使用Objective-C++为iOS编写一个大型项目.我主要使用Objective-C作为UI和其他Apple API,使用C++进行内部音频处理和其他信息处理.我想知道自由混合Objective-C和C++的缺点.
当然,混合两个对象模型有其固有的局限性以及混乱和混乱的可能性.我更好奇的是如何使用Objective-C++会影响编译过程,我可能会遇到的语法缺陷,可读性问题以及我如何避免这些,等等.我很想知道你对Objective-C++的体验有什么就像接近这个以及你可能有的提示一样.
是否有一个转换的好方法vector<int32_t>到NSArray的NSNumber或循环,并增加了NSMutableArray相当多的唯一途径?
我有一个RGB unsigned char的缓冲区,我想将其转换为位图文件,有谁知道怎么做?
我的RGB float具有以下格式
R [(0,0)],G [(0,0)],B [(0,0)],R [(0,1)],G [(0,1)],B [(0, 1)],R [(0,2)],G [(0,2)],B [(0,2)] .....
每个数据单元的值范围从0到255.任何人都有任何想法如何进行此转换?
我正在尝试混合使用C++和Objective-C,我已经完成了大部分工作,但希望在Objective-C和C++代码之间有一个单独的接口类.因此,我想在ViewController接口中拥有一个持久的C++对象.
禁止使用没有类型的'myCppFile'声明失败:
#import <UIKit/UIKit.h>
#import "GLView.h"
#import "myCppFile.h"
@interface GLViewController : UIViewController <GLViewDelegate>
{
myCppFile cppobject;
}
@end
Run Code Online (Sandbox Code Playgroud)
但是这在.mm实现文件中运行得很好(它不起作用因为我希望cppobject在调用之间保持不变)
#import "myCppFile.h"
@implementation GLViewController
- (void)drawView:(UIView *)theView
{
myCppFile cppobject;
cppobject.draw();
}
Run Code Online (Sandbox Code Playgroud) 我正在研究我的程序,似乎设置中的某些内容发生了变化.突然我得到错误"类'Foo'的重复接口声明".它提到了一个重复的头文件,但只有一个副本.
有趣的是,这只发生在调试模式,而不是设备模式.
有谁知道什么可能是错的?
我正在使用Objective-C++和一些静态库.
假设您有以下 C++ 类的定义:
class A {
// Methods
#ifdef X
// Hidden methods in some translation units
#endif
};
Run Code Online (Sandbox Code Playgroud)
这是否违反了班级的一个定义规则?有哪些相关危害?我怀疑如果使用成员函数指针或虚函数,这很可能会中断。否则使用安全吗?
我在 Objective C++ 的上下文中考虑它。头文件包含在纯 C++ 和 Objective C++ 翻译单元中。我的想法是使用 OBJC 宏保护具有 Objective-C 类型的方法。否则,我必须对标头中的所有 Objective-C 类型使用 void 指针,但这样我就失去了强类型,并且必须在整个代码中添加丑陋的静态强制转换。
c++ objective-c conditional-compilation objective-c++ one-definition-rule
我目前正在忙于一个项目,我需要使用外部附件来阅读Mifare 1k标签.
附件提供了一个SDK,用(Objective?)C++编写,我按照提供的指令将XCode设置为"Compile sources as:Objective-C++",并在"Other linkers flags"中添加"-Obj-C++".
SDK编译好了,但麻烦的是我已经在项目中使用了几个库(例如ASIHTTPRequest,JSONKit,...),并且因为这些库中的那些新设置而导致编译问题.如果我切换回以前的设置,我会在阅读器的SDK中遇到编译问题
问题是:有没有办法只从SDK中编译类作为C++,而项目的其余部分作为objective-c?
编辑: SDK文件仅包含.h(和链接库)
谢谢你的帮助,迈克
xcode compilation objective-c conditional-compilation objective-c++
objective-c++ ×10
objective-c ×8
c++ ×6
cocoa ×3
xcode ×3
ios ×2
iphone ×2
bitmap ×1
cocoa-touch ×1
coding-style ×1
compilation ×1
macos ×1
nsarray ×1
nsopenpanel ×1
rgb ×1
vector ×1