我需要将ObjC类实现文件重命名为*.mm,因为我使用的是C++ Framework(Box2D).重命名文件并将Filetype设置为"sourcecode.cpp.objcpp"后,我的以下私有方法声明会产生一些错误,例如:
错误:'私人'之前的预期标识符
方法声明:
@interface GameplayLayer(private)
- (void)spawnTick:(ccTime)delta;
- (void)pushSpawnTick;
@end
Run Code Online (Sandbox Code Playgroud)
如何在ObjC++中使用私有方法的声明?
另一个可能是愚蠢的风格问题:
并发应该如何锁定?执行者或调用者应该负责锁定线程吗?
例如没有特定的语言......
Caller::callAnotherThread() {
_executor.method();
}
Executor::method() {
_lock();
doSomething();
_unlock();
}
Run Code Online (Sandbox Code Playgroud)
或者
Caller::callAnotherThread() {
_executor.lock()
_executor.method();
_executor.unlock()
}
Executor::method() {
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
我对线程和锁定知之甚少,所以我想确保代码是健壮的。第二种方法允许线程不安全调用...从技术上讲,您可以在不执行任何锁定的情况下调用 _executor.method()。
帮助?
谢谢,
我试图清楚地为你描述我的问题,所以它可能有点长,我真的很感激,如果你能阅读它并提供一些建议.谢谢.
我有一个库项目,让我们调用它MyCppLib,其中包含一些遗留的c ++代码,我在这个项目中添加了一个适配器类,这样我就可以在其他项目中使用objective-c ++.这是MyCppLib项目概述.
Project MyCppLib
- 一些遗留的c ++代码
- Adapter.h
- Adapter.mm
我有另一个项目,我们称之为Main项目,它将MyCppLib项目用作静态库.所以我使用xCode 4来编译MyCppLib,并在xCode 4中获取libMyCppLib.a和配置Main项目以将其与Main项目链接.这是Main项目概述.
Project Main
- 一些 不包含'.mm'文件的objective-c类
- Adapter.h
- libMyCppLib.a 作为静态库
当我Main在xCode 4中编译项目时,我遇到了一些错误:
架构armv6的未定义符号:
"operator new(unsigned long)",引自:
- libMyCppLib中的libMyCppLib.a(Adapter.o)
my :: cpp :: namespace :: MyCppClass :: MyCppClass()中的[Adapter init] . a(MyCppClass .o)...... 一些其他类似的错误
ld:找不到架构armv6的
符号:collect2:ld返回1退出状态
我认为这可能是因为Main项目没有objective-c ++功能,所以我在Main项目中添加了一个'.mm'文件.现在 …
有没有一种简单的方法将 a 转换CTypeRef为特定的 CoreFoundation 类型?我不想进行内联转换,(CFStringRef)myObjectRef但想创建一个辅助方法来为所有 CoreFoundation 类型执行此操作。
我知道可以使用类似的方法CFGetTypeID(myObjectRef) == CFStringGetTypeID()来确定 a 是否CTypeRef是 a CFString。然而,创建单个方法来执行此操作可能会变得非常冗长并且有很多 if 语句。
构建一个带有一堆 if 语句的方法是CFGetTypeID()唯一的方法吗?或者有更简单的方法来做到这一点吗?
更新:举例
我想创建一个辅助函数来处理一些我无法更改的遗留代码。目前,它生成 之一CFDictionaryRef,CFStringRef或CFURLRef作为作为 a 提供的返回值CTypeRef。我目前正在通过运行CFGetTypeID()返回值来解决这个问题,但这并不理想。与其到处都有 C 风格的强制转换,我宁愿有一个CastToCF()助手来帮我处理这个问题。这也将有助于使未来的测试变得更加容易。
PS 我不担心可变类型。
我在Xcode中有一个Objective-C++项目,它在正常的构建方案上编译得很好,但是当我为Archive,Analyze或Profile编译时,我得到了编译错误:
必须使用'class'标记来引用此范围中的'Line'类型
这是我的代码的一个非常简化的版本:
class Document;
class Line
{
public:
Line();
private:
friend class Document;
};
class Document
{
public:
Document();
private:
friend class Line;
};
Run Code Online (Sandbox Code Playgroud)
错误发生在我尝试使用Line类型的任何地方.例如.
Line *l = new Line();
Run Code Online (Sandbox Code Playgroud)
你知道如何解决这个错误信息以及为什么它只在编译上面列出的一个方案时出现?
所以我想在我的cocos2d + box2d项目中公开公开一个指向其他Objective-C++类的Box2D(C++)指针.我在我的界面中声明了一个方法"getWorld",它引用了C++类b2World并导入了Box2D.h.我项目中的所有文件都是.mm扩展名,我收到以下编译错误:
In file included from DebugDrawLayer.mm:2:
In file included from World.h:10:
In file included from external/Box2d/Box2D/Box2D.h:34:
external/Box2d/Box2D/Common/b2Settings.h:22:10: fatal error: 'cassert' file not found
#include <cassert>
Run Code Online (Sandbox Code Playgroud)
我猜Box2D.h以某种方式编译为C而不是C++,但我不明白这是怎么发生的.根据日志,包含链明显从.mm文件开始.
更新:
对于World.mm(之前编译)的日志说明它明确编译为objective-c ++
CompileC Objects-normal/i386/World.o World.mm normal i386 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler
Run Code Online (Sandbox Code Playgroud)
但对于DebugDrawLayer.mm,它表示objective-c
CompileC Objects-normal/i386/DebugDrawLayer.o DebugDrawLayer.mm normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler
Run Code Online (Sandbox Code Playgroud)
这两个文件都设置为默认值 - Objective-C++ source.是什么赋予了..?
如果您在 Objective-C 样式块中捕获对 ARC 下的强引用self,则需要使用__weak指针来避免 ARC“保留周期”问题。
// Right way:
- (void)configureBlock {
XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
[weakSelf doSomething]; // capture the weak reference
// to avoid the reference cycle
}
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道保留周期是什么,但这个答案对此进行了一些描述。我只知道你应该__weak对 Objective-C 风格的块使用指针。请参阅捕获 self 时避免强引用循环。
self但我的问题是,在 C++ 块下捕获时是否需要创建弱指针<functional>?
- (void)configureBlock {
self.block = [self](){
[self doSomething]; // is this ok? It's not an objective C block.
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下库在 Xcode 中创建一个简单的控制台应用程序:
https://github.com/marstone/ingress-ios/tree/master/s2-geometry
我正在找到该库,但没有找到算法库。
示例代码示例
#import <Foundation/Foundation.h>
#import "S2Geometry.h"
#include "s2.h"
#include "s2cellid.h"
#include "s2latlng.h"
#include "s2latlngrect.h"
#include "s2regioncoverer.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
S2LatLngRect rect = S2LatLngRect(S2LatLng::FromDegrees(MIN(37.78272, 37.781719), MIN(-121.971427, -121.972007)), S2LatLng::FromDegrees(MAX(37.78272,
37.781719), MAX(-121.971427, -121.972007)));
}
return 0; }
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
./s2-geometry/s2.h:6:10: fatal error: 'algorithm' file not found
Run Code Online (Sandbox Code Playgroud) 我正在编写一些用于处理小数数据(而不是浮点数据)的目标代码,到目前为止有以下内容:
class frac {
public:
int numerator;
unsigned int denominator;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如何配置我的类定义,以便写入unsigned frac foo;使对象与 相同frac foo;,但int numerator;会变成unsigned int numerator;?
编辑:
虽然通常我只使用模板 ( frac <unsigned>),但此代码将用于更大的数学 API,我更喜欢最终产品使用unsigned frac语法
扩展:
很多答案都说不可能实现unsigned frac语法,但有谁知道为什么不呢?C++ 编译器是否有一些适用于现有unsigned类型的特殊处理规则,或者我还缺少其他什么?
我有一个 Objective-C++ 类,我希望它有一个 C++ 属性std::vector<std::string>。我已经这样声明了:
@interface WordModel : NSObject
@property std::vector<std::string> words;
@end
Run Code Online (Sandbox Code Playgroud)
当我尝试添加单词时,vector什么也没有发生。例如,在-init方法中,我这样做:
std::string nextLine;
while(wordsFile.good())
{
std::getline(wordsFile, nextLine);
if (nextLine.length() > 0)
{
self.words.push_back(nextLine);
}
}
Run Code Online (Sandbox Code Playgroud)
调用push_back()调试器后报告self.words vector仍为空。为什么?在编译期间或运行时都没有错误消息。
如果我将属性更改为 ivar,一切都会按预期进行。也就是说,如果我把它变成这样:
@interface WordSetModel : NSObject
{
std::vector<std::string> words;
}
@end
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么会有这样的差异。
objective-c++ ×10
objective-c ×4
c++ ×2
block ×1
box2d-iphone ×1
coding-style ×1
ios ×1
iphone ×1
locking ×1
properties ×1
pthreads ×1
xcode ×1
xcode4 ×1