- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Objective-C++。我遇到的问题是我需要将 std::vector 传递给 objective-c 方法。这可能吗?下面是我当前的代码,在作为 C 数组传递给方法之前,我必须在 vector 定义方法中对 vector 进行计算(向数组成员添加偏移值)。理想情况下,我想在第二种方法中设置偏移值,从而拆分定义(其中会有几个)与下面的示例不同,偏移量是可变的。
所以我不想传入 (b2Vec2 *)vect,而是使用 vector
- (void)createterrain1 {
using namespace std;
vector<b2Vec2>vecVerts;
vector<int>::size_type i;
vecVerts.push_back(b2Vec2(-1022.5f / 100.0, -20.2f / 100.0));
vecVerts.push_back(b2Vec2(-966.6f / 100.0, -18.0f / 100.0));
vecVerts.push_back(b2Vec2(-893.8f / 100.0, -10.3f / 100.0));
vecVerts.push_back(b2Vec2(-888.8f / 100.0, 1.1f / 100.0));
vecVerts.push_back(b2Vec2(-804.0f / 100.0, 10.3f / 100.0));
vecVerts.push_back(b2Vec2(-799.7f / 100.0, 5.3f / 100.0));
vecVerts.push_back(b2Vec2(-795.5f / 100.0, 8.1f / 100.0));
vecVerts.push_back(b2Vec2(-755.2f/ 100.0, -9.5f / 100.0));
vecVerts.push_back(b2Vec2(-632.2f / 100.0, 5.3f / 100.0));
vecVerts.push_back(b2Vec2(-603.9f / 100.0, 17.3f / 100.0));
vecVerts.push_back(b2Vec2(-536.0f / 100.0, 18.0f / 100.0));
vecVerts.push_back(b2Vec2(-518.3f / 100.0, 28.6f / 100.0));
vecVerts.push_back(b2Vec2(-282.1f / 100.0, 13.1f / 100.0));
vecVerts.push_back(b2Vec2(-258.1f / 100.0, 27.2f / 100.0));
vecVerts.push_back(b2Vec2(-135.1f / 100.0, 18.7f / 100.0));
vecVerts.push_back(b2Vec2(9.2f / 100.0, -19.4f / 100.0));
vecVerts.push_back(b2Vec2(483.0f / 100.0, -18.7f / 100.0));
vecVerts.push_back(b2Vec2(578.4f / 100.0, 11.0f / 100.0));
vecVerts.push_back(b2Vec2(733.3f / 100.0, -7.4f / 100.0));
vecVerts.push_back(b2Vec2(827.3f / 100.0, -1.1f / 100.0));
vecVerts.push_back(b2Vec2(1006.9f / 100.0, -20.2f / 100.0));
vecVerts.push_back(b2Vec2(1023.2fdddddd / 100.0, -20.2f / 100.0));
i = vecVerts.size();
//I would like to pass this sets of calculations to the stitch method below rather
than do it here
vector<b2Vec2>::iterator pos;
//add y offset value to our b2Vec2
for(pos = vecVerts.begin();pos != vecVerts.end();++pos)
{
//get b2Vec2 value at index
b2Vec2 currVert = *pos;
//add y offset (this will come from the sprite image size latterly, set value for testing only
b2Vec2 addVert = b2Vec2(currVert.x,currVert.y + 40 /PTM_RATIO);
//copy offset added b2Vec2 back to vector as index
pos->b2Vec2::operator=(addVert);
}
//currently using this as kludge to pass my vector to the stitch method
b2Vec2 * chain = &vecVerts[0];
[self stitchterrainvertswith:chain num:i];
这是我当前将 vector 作为 C 样式数组传递的方法
-(void)stitchterrainvertswith:(b2Vec2 *)verts num:(int)num {
//create bodydef
b2BodyDef groundBodyDef;
//set body as static
groundBodyDef.type = b2_staticBody;
//set body position
groundBodyDef.position.Set(0, 0);
//create body using def
groundBody = world->CreateBody(&groundBodyDef);
//create shapes
b2EdgeShape screenEdge;
b2ChainShape terrain;
terrain.CreateChain(verts, num);
groundBody->CreateFixture(&terrain,0);
//keeps track of max x value for all the ground pieces that are added to the scene
//maxVerts.x += totalXVerts.x;
}
我尝试对 std::vector 使用 objc 包装器,但有点迷失了这里是我的示例:
VecWrap.h
#import "Box2D.h"
#include <vector>
struct VecAcc;
@interface VecWrap : NSObject
{
struct VecAcc* vec;
}
@end
VecWrap.MM
#import "VecWrap.h"
struct VecAcc {
std::vector<b2Vec2>data;
};
@implementation VecWrap
-(id)init
{
vec = 0;
if (self == [super init]) {
vec = new VecAcc;
}
return self;
}
-(void)dealloc
{
delete vec;
[super dealloc];
}
@end
然后创建以下方法:
-(void)stitchgroundvectswith:(VecAcc*)vecs num:(int)num;
哪个行不通这甚至可能吗?
最佳答案
一切正确,Barry Wark 的解决方案有效,但我不推荐它,因为像这样的特定于语言的预处理器技巧在 IMO 中是脆弱的。特别是,如果涉及 namespace ,它们将无法正常工作,并且只能在指针上工作。
首先,我强烈建议开发人员尽可能将 ObjC 和 C++ 分开,并将 ObjC++ 减少到真正需要的几个地方。 ObjC++ 是一种疯狂的语言,gdb 经常遇到麻烦,它会损害 ARC 性能,编译速度较慢,并且通常主要是一种有时有用的 hack 而不是真正的语言。
我推荐这种方法来在 header 中对 ObjC 隐藏您的 C++ 方法:
@interface MyClass
- (void)anOtherMethodCalledFromObjC;
#ifdef __cplusplus
- (void)stitchGroundVectsWithVector:(std::vector<b2Vec2>)vec;
#endif
@end
但一般来说,我建议您的大部分程序都是 .m 和 .cpp 文件,并使用一些 .mm 文件将它们粘合在一起。
有关如何在旧代码中执行此操作的广泛讨论,请参阅 Wrapping C++-Take 2 .较新的代码不需要在 header 中包含 ivars,因此现在实现起来应该更简单。
关于c++ - objective-c 方法中的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8713514/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!