有人可以帮助我将c ++代码转换为Objective c

时间:2010-08-13 05:22:08

标签: c++ objective-c

对此有什么相同的目标c:

template<class T>
class Singleton 
{ 
public: 
    static T * instance() 
    { 
        static T t; 
        return &t; 
    }
private: 
    Singleton(); 
    ~Singleton(); 
};

致电:

friend class Singletone<MyManagerClass>;

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

当编译为Objective-C ++时,Objective-C不提供模板和模板不能与Objective-C类一起使用。在两种编程语言之间进行1对1转换并不总是可行的。例如,Objective-C根本不提供编译时强制私有方法,因此无法完全实现您想要的。

另一方面,Objective-C具有C ++中没有的功能,例如@encode()指令。

或许与此主题相关:重要的是要理解与C ++兼容的设计模式不一定能够很好地工作 - 或者根本不能 - 使用Objective-C。

您的设计能够将任何课程单一化的目标是什么?也许有更成熟的Objective-C方式来实现你想要的东西。也许有一种方法可以使用预处理器宏来实现类似的东西,但是你不想沿着这条路走下去。

答案 2 :(得分:0)

哦,那太容易了!

@interface YourClass : NSObject {}
+ (YourClass *)singleton;
@end

static YourClass *singletonVar = nil;
@implementation YourClass
+ (YourClass *)singleton
{
  if( ! singletonVar ) {
    singletonVar = [[self alloc] init];
  }
  return singletonVar;
}
@end

现在你可以在任何地方调用[[YourClass singleton] doSomething]! :d 就像你[[NSUserDefaults standUserDefaults] valueForKey:@“Burp”]之类的那样, 请注意,此广告会对您的应用产生开销,因此当您在范围内多次使用单例时,请考虑将其存储在指针中以提高性能。

答案 3 :(得分:0)

#define SINGLETON_FOR_CLASS(classname)                          \
                                                                \
static classname *shared##classname = nil;                      \
                                                                \
+ (classname *)instance {                                       \
    @synchronized(self) {                                       \
        if (shared##classname == nil) {                         \
            [[self alloc] init];                                \
        }                                                       \
    }                                                           \
                                                                \
    return shared##classname;                                   \
}                                                               \
                                                                \
+ (id)allocWithZone:(NSZone *)zone {                            \
                                                                \
    @synchronized(self) {                                       \
        if (shared##classname == nil) {                         \
            shared##classname = [super allocWithZone:zone];     \
            return shared##classname;                           \
        }                                                       \
    }                                                           \
                                                                \
    return nil;                                                 \
}                                                               \
                                                                \
- (id)copyWithZone:(NSZone *)zone {                             \
                                                                \
    return self;                                                \
}                                                               \
                                                                \
- (id)retain {                                                  \
                                                                \
    return self;                                                \
}                                                               \
                                                                \
- (NSUInteger)retainCount {                                     \
                                                                \
    return UINT_MAX;                                            \
}                                                               \
                                                                \
- (void)release {                                               \
                                                                \
}                                                               \
                                                                \
- (id)autorelease {                                             \
                                                                \
    return self;                                                \
}                                                               \