2012-12-31 38 views
0

我想在纯C++类(.cpp)和纯粹的目标c对象(.m)之间做一个objective-C++包装(.mm)。一个好的工作示例可以是found on github。我可以构建并运行这个没有问题。objective-c包装调用c + +静态成员函数

但是我需要访问C++类中的静态成员函数。

// ================== 
// DummyModel.h 
// ================== 

class DummyModel 
{ 
    public: 
     static int test(); 

}; 

// ================== 
// DummyModel.cpp 
// ================== 

#include "DummyModel.h" 


static int test() 
{ 
    int x = 1; 
    return x; 
} 


// ================== 
// DummyModelWrapper.h 
// ================== 

#import <Foundation/Foundation.h> 

@interface DummyModelWrapper : NSObject 

- (int) test; 

@end 

// ================== 
// DummyModelWrapper.mm 
// ================== 

#import "DummyModelWrapper.h" 
#import "DummyModel.h" 

@implementation DummyModelWrapper 

- (int) test 
{ 
    int result; 
    result = DummyModel::test(); 
    return result; 
} 

@end 

这产生以下错误::

Undefined symbols for architecture i386: 
    "DummyModel::test()", referenced from: 
     -[DummyModelWrapper test] in DummyModelWrapper.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

正是这种参考在DummyModelWrapper.mm即是测试我已经通过去除所有现有的功能,并引入一个静态成员函数修改的github上例调用错误:

result = DummyModel::test(); 

测试项目从GitHub的项目,编译和运行在它精细的调整修改前的形式(它实例DummyModel并调用实例上的成员函数)。一旦我尝试添加静态成员并从包装器对象访问它,就会发生错误。

我已经阅读了一切,我可以找到在stackoverflow和其他地方,但只能找到涉及非静态成员函数的示例。

引用
http://www.philjordan.eu/article/mixing-objective-c-c++-and-objective-c++
http://robnapier.net/blog/wrapping-cppfinal-edition-759
http://www.boralapps.com/an-objective-c-project-that-uses-c/294/

环境
xcode的4.5.2/osx8.2(靶向的ios5 +)

+0

如果你在“.M”文件调用C++代码,应该不会是个“.mm”文件扩展名呢?或者,源文件中的评论可能不准确?无论如何,请参阅下面的[benjorbin's](http://stackoverflow.com/questions/14104510/objective-c-wrapper-invoking-c-static-member-functions/14104585#14104585)。 – WhozCraig

+0

是的,对不起,这是一个错误的错字,在问题中修复 – foundry

回答

2

内部DummyModel.cpp,取代

static int test() 
{ 
    ... 
} 

通过

int DummyModel::test() 
{ 
    ... 
} 
+0

谢谢你解决它,但我不明白为什么。定义和声明签名不应该匹配吗?你能指出我的任何明确的在线参考? – foundry

+0

这是基本的类/名称空间方法定义逻辑 - 您的声明必须包含类说明符,否则它不是类的方法,而是一个简单的函数(在本例中为静态函数) - 这是由于C++基于这是C根 – Petesh

+0

@Petesh,因为你已经注意到我的C++知识是非常基本的。 'Static'似乎有很多用途。引用Bruce Eckel的__Thinking in C++ __“在人们知道术语”重载“意味着什么之前,static关键字在C中被重载,并且C++增加了另一个含义。” (他后来将其描述为“混乱”)。我现在在做很多的阅读。我问这个问题,以帮助我在c + +和obj-c上的[另一个答案](http://stackoverflow.com/questions/13958321/iosretrieve-rectangle-shaped-image-from-the-background-image),它教给我我知道得有多少。尽管我设法让它工作。 – foundry