gpt4 book ai didi

c++ - 混合 C++ 和 Objective-C

转载 作者:可可西里 更新时间:2023-11-01 15:16:11 26 4
gpt4 key购买 nike

我使用 C++ 作为应用主干,使用 Objective-C 作为 GUI,没问题。

但是当谈到在 Objective-C++(.mm 文件)中将这些代码混合在一起时,我有几个问题:

1。我可以将 STL 容器与 Objective-C 或 Cocos2D 对象混合使用吗?

例如在 Objective-C header 中,我可以执行以下操作吗?

#include <vector>
#include <boost\shared_ptr.hpp>
@interface MyClass : NSObject {
std::vector<boost::shared_ptr<CCSprite> > m_spriteList;
}

然后在.mm文件中,我想做

CCSprite* newSprite = [/* cocos2d stuff here... */];
m_spriteList.push_back(newSprite);

上面的代码有效吗?它当然是在 C++ 中,但我不确定在混合 C++ 和 Objective-C 和 Cocos2D 时。

2。在 Objective-C 中使用 C++ 智能指针对象进行内存管理?

当我尝试在 Objective-C 中使用 C++ 代码时,我想在 Objective-C 头文件中声明一个 C++ 对象作为成员变量。

假设我在 test.h header 中声明了一个 C++ 类:

Test{
};

在Objective-C头文件中,我想做

#include "test.h"
#incude <boost/scoped_ptr.hpp>

#include <vector>
@interface MyClass : NSObject {
Test* m_testObjectPtr; // (1)
boost::scoped_ptr<Test> m_testOjbSmartPtr; // (2)
}

在上面的代码中,(2) 可以吗?我可以像在 C++ 代码中一样在 Objective-C 中使用智能指针吗?我可以假设 Test 类析构函数将在 MyClass 对象被销毁时调用吗?

或者如果 (2) 在 Objective-C++ 中不可行,那么 (1) 可行吗?我需要手动打电话吗dealloc中删除m_testObjectPtr

最佳答案

只能在 C++ 类上使用智能指针。如果你在 objective-c 类上使用 then,你将得到编译错误或在某处崩溃。
您还可以使用带有 objective-c 类指针的容器,例如

std::vector<CCSprite *> spriteList;

只需确保在将它们插入列表时保留它们并在删除它们时释放它们。
在这两种情况下,您都可以制作自己的智能指针,根据需要在构造函数/析构/复制中调用保留和释放,然后不用担心保留释放。
此外,当对象被释放时,成员 c++ 对象的析构函数将被自动调用。
一个 objective-c 包装器的例子是

template<typename T>
struct shared_objc_object
{
T *Object;
shared_objc_object : Object(nil) { }
shared_objc_object(T *Object) : Object([Object retain]) { }
shared_objc_object(shared_objc_object &other) :
Object([other.Object retain]) { }
~shared_objc_object() { [Object release]; }
shared_objc_object &operator =(shared_objc_object &other)
{
[Object release];
Object = [other.Object retain];
}
}

你可以使用

std::vector<shared_objc_object<CCSprite *>> spriteList;
spriteList.push_back(some_sprite);

并且不关心保留/释放

关于c++ - 混合 C++ 和 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8172166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com