代码之家  ›  专栏  ›  技术社区  ›  LandonSchropp

Objy-C与C++混合

  •  43
  • LandonSchropp  · 技术社区  · 14 年前

    我试着把ObjuleC与C++结合起来。当我编译代码时,我得到了几个错误。

    A.

    #import <Cocoa/Cocoa.h>
    #include "B.h"
    
    @interface A : NSView {
        B *b;
    }
    
    -(void) setB: (B *) theB;
    
    @end
    

    A.M

    #import "A.h"
    
    @implementation A
    
    - (id)initWithFrame:(NSRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code here.
        }
        return self;
    }
    
    - (void)drawRect:(NSRect)dirtyRect {
        // Drawing code here.
    }
    
    -(void) setB: (B *) theB {
        b = theB;
    }
    
    @end
    

    B.H

    #include <iostream>
    
    class B {
    
        B() {
            std::cout << "Hello from C++";
        }
    
    };
    

    以下是错误:

    /Users/helixed/Desktop/Example/B.h:1:0 /Users/helixed/Desktop/Example/B.h:1:20: error: iostream: No such file or directory
    /Users/helixed/Desktop/Example/B.h:3:0 /Users/helixed/Desktop/Example/B.h:3: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'B'
    /Users/helixed/Desktop/Example/A.h:5:0 /Users/helixed/Desktop/Example/A.h:5: error: expected specifier-qualifier-list before 'B'
    /Users/helixed/Desktop/Example/A.h:8:0 /Users/helixed/Desktop/Example/A.h:8: error: expected ')' before 'B'
    /Users/helixed/Desktop/Example/A.m:26:0 /Users/helixed/Desktop/Example/A.m:26: error: expected ')' before 'B'
    /Users/helixed/Desktop/Example/A.m:27:0 /Users/helixed/Desktop/Example/A.m:27: error: 'b' undeclared (first use in this function)
    
    5 回复  |  直到 10 年前
        1
  •  76
  •   Pablo Santa Cruz    14 年前

    你需要说出你的名字 m 文件夹 毫米 . 您将能够用Objtovi-C编译C++代码。

    因此,按照您的示例, Am 文件应命名为 查看详情 . 就这么简单。它工作得很好。我在iPhone项目中使用了很多STD容器(STD::Vector,STD::队列等)和遗留C++代码,没有任何并发症。

        2
  •  5
  •   LandonSchropp    14 年前

    没关系,我觉得自己很蠢。您所要做的就是将aview.m重命名为aview.m m,这样编译器就知道它是Objective-C++,编译时不会出现问题。

        3
  •  2
  •   Leonardo    12 年前

    可以通过C++类的前向声明来保持接口清洁器:

    #import <AnObjCclass.h>
    class DBManager; // This is a C++ class. NOTE: not @class
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate,
                                        CLLocationManagerDelegate,
                                        MFMailComposeViewControllerDelegate>
    {
        DBManager* db;
    ...
    }
    
        4
  •  1
  •   Govind    10 年前

    我分享了我在这个话题上理解的一些观点。

    我们可以将.cpp和.m文件与纯C接口混合。众所周知,CLAN编译器将支持C++、目标C以及目标C++,这可能是混合这些语言的一种更好的方法。

    混合这些语言时要注意的一件事是使用头文件。通过在类扩展中声明CPP对象,我们可以将C++保持在我们的目标C标题中。

    或者,我们可以在目标cpp(.mm)文件中@implementation块的开头声明cpp对象。

    当我们处理cpp对象时,管理内存将是一个问题。我们可以使用__new_trade为对象分配内存,并通过调用__delete object_trade释放内存。通常,如果我们使用ARC,我们不需要知道释放对象的内存。

    当使用cpp类时,我们可以用两种方式声明cpp对象,如cpp wrapper wrapper和cpp wrapper*wrapper,其中cpp wrapper是cpp类。当我们使用后者时,程序员负责管理内存。

    另一个主要问题是,当我们使用参数调用一个目标C方法时,我们正在传递引用,而在cpp中,我们需要使用__&226;_关键字通过引用传递参数,否则会传递对象的副本。

    目标C对象的释放是在运行时处理的,当对cpp对象调用__delete_时,它将不再保留在内存中。

    在编写cpp时,我们共享指针和弱指针,这类似于目标c中的强指针和弱指针。

    http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++ http://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1

        5
  •  0
  •   Gabe Rainbow    11 年前

    在您希望引入一个简单的C++函数的情况下 std::cout << 然后热舔提供了一个很好的选择。

    改变“ Identity and Type “来自: Objective-C source 到: Objective-C++ source

    .mm扩展名只标识文件类型;然后您要查找的是Objective-C++而不是Objective-C类型。