【问题标题】:objective-c wrapper invoking c++ static member functions调用 c++ 静态成员函数的目标 c 包装器
【发布时间】:2013-01-01 02:14:51
【问题描述】:

我正在尝试在纯 c++ 类 (.cpp) 和纯 Objective-c 对象 (.m) 之间创建一个 Objective-C++ 包装器 (.mm)。一个很好的工作示例可以是found on github。我可以毫无问题地构建和运行它。

但是我需要访问 c++ 类中的静态成员函数。我通过删除所有现有函数并引入静态成员函数来修改 github 示例:

//  ==================
//  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 中测试的引用导致了错误:

   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+)

【问题讨论】:

  • 如果您在“.m”文件中调用 C++ 代码,它不应该是“.mm”文件扩展名吗?还是源文件中的注释不准确?无论如何,请参阅下面的benjorbin's 答案。
  • 是的,抱歉,这是一个错误的错字,已在问题中修复

标签: c++ objective-c xcode


【解决方案1】:

在 DummyModel.cpp 中,替换

static int test ()
{
    ...
}

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

【讨论】:

  • 谢谢它确实解决了它,但我不明白为什么。定义和声明签名不应该匹配吗?你能指出任何明确的在线参考资料吗?
  • 这是基本的类/命名空间方法定义逻辑——你的声明必须包含类说明符,否则它不是类的方法,而是一个简单的函数(在这种情况下是一个静态函数)——这个是因为 C++ 是基于它的 C 根
  • @Petesh,您已经注意到我的 C++ 知识非常初级。 Static 似乎有很多用途。引用 Bruce Eckel 的 Thinking in C++ “在人们知道“重载”一词的含义之前,静态关键字在 C 中已被重载,而 C++ 又增加了另一种含义。 (他后来将其描述为“令人困惑”)。我现在正在做很多阅读。我问这个问题是为了帮助我在 c++ 和 obj-c 上使用 another answer,它告诉我我知道的很少。我设法让它工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多