временные интервалы в объективе C - PullRequest
0 голосов
/ 19 мая 2011

Я преобразовал следующий код из cpp в Objective C

xyz.h

#define DECLARE_RS232_NEWMSG(ClassName,ClassID)                 \
+(ClassName*)FromMsg:(RS232Msg*)pMsg                            \
{                                                               \
ClassName* ivar = [[ClassName alloc]init];                      \
return [ pMsg];                                                 \
}                                                               \
+(RS232Msg*)NewMsg                                              \
{                                                               \
return new ClassName;                                           \
}                                                               \
enum {ID = ClassID};          

xyz.m

@implementation RS232MsgGetEventDescriptions

+ (id)getID
{
    DECLARE_RS232_NEWMSG(RS232MsgGetEventDescriptions,RM_GET_EVENT_DESCRIPTIONS);
    return ID;
}

@end

получение ошибок при использовании NewMsg , ID , FromMsg из других файлов. Я включил все файлы заголовков.

РЕДАКТИРОВАНИЕ:

RS232MsgGetEventDescriptions.h

#define DECLARE_RS232_NEWMSG(ClassName, ClassID)   \
enum {ID = ClassID};                               \
@interface ClassName: NSObject {}                  \
+(ClassName*)FromMsg:(RS232Msg*)pMsg;              \
+(RS232Msg*)NewMsg;                                \
@end;

#define DEFINE_RS232_NEWMSG_IMPLEMENTATION(ClassName, ClassID) \
+(ClassName*)FromMsg:(RS232Msg*)pMsg                           \
{                                                              \
ClassName* ivar = [[ClassName alloc]init];                     \
return [ivar pMsg];                                            \
}                                                              \
+(RS232Msg*)NewMsg                                             \
{                                                              \
return [[ClassName alloc]init];                                \
}                                                              \
+ (id)getID                                                    \
{                                                              \
return ID;                                                     \
}                                                              \

@interface RS232MsgGetEventDescriptions : RS232Msg{
@public
DECLARE_RS232_NEWMSG(RS232MsgGetEventDescriptions,RM_GET_EVENT_DESCRIPTIONS);
}
@end    

RS232MsgGetEventDescriptions.m

@implementation RS232MsgGetEventDescriptions
-(id)init
{
    if (self = [super init]) {
        DEFINE_RS232_NEWMSG_IMPLEMENTATION(RS232MsgGetEventDescriptions,RM_GET_EVENT_DESCRIPTIONS);
    }
    return self;
}
@end

Необъявленная ошибка FromMsg и необъявленная ошибка NewMsg.

ошибка: ожидаемый список спецификаторов-спецификаторов перед «интерфейсом»

ошибка: ожидаемый список спецификаторов-спецификаторов перед маркером '+'

ошибка: ожидаемый список спецификаторов-спецификаторов перед 'end'

ошибка: ожидаемый список спецификаторов-спецификаторов перед «интерфейсом»

ошибка: ожидаемый список спецификаторов-спецификаторов перед маркером '+'

ошибка: ожидаемый список спецификаторов-спецификаторов перед 'end'

ошибка: «NewMsg» необъявлен (первое использование в этой функции)

1 Ответ

2 голосов
/ 19 мая 2011

Похоже, вы пытаетесь объявить FromMsg и NewMsg как методы класса в методе класса getID.В этом отношении Objective-C похож на C: вы не можете объявлять функции (или методы) внутри функций (или методов).Кроме того, если вы не объявляете ID до тех пор, пока не окажетесь в исходном файле, его никто не увидит, так как соблюдаются соглашения C с точки зрения компиляции каждого файла в отдельности и изоляции, а затем связывания их всех вместе вконец.

Вероятно, вы пришли из Java-фона, поэтому эти практики, вероятно, будут выглядеть немного примитивными.К сожалению, Objective-C довольно сильно отклоняется от принципа «не повторяй себя».

Если цель #define состоит в том, чтобы создать что-то вроде шаблона, я бы посоветовал вам хотеть либо два уровняфайла заголовка (один для определения шаблона, другой для использования его с соответствующим именем класса и числовым идентификатором) или для использования более традиционных отношений класса / подкласса.

Например,

xyzTemplate.h

#define DECLARE_RS232_NEWMSG(ClassName, ClassID)   \
enum {ID = ClassID};                               \
                                                   \
@interface ClassName: NSObject {}                  \
+(ClassName*)FromMsg:(RS232Msg*)pMsg;              \
+(RS232Msg*)NewMsg;                                \
@end;

#define DEFINE_RS232_NEWMSG_IMPLEMENTATION(ClassName, ClassID) \
@implementation ClassName                                      \
                                                               \
+(ClassName*)FromMsg:(RS232Msg*)pMsg                           \
{                                                              \
    ClassName* ivar = [[ClassName alloc] init];                \
    return [ivar pMsg];                                        \
}                                                              \
                                                               \
+ (RS232Msg*)NewMsg                                            \
{                                                              \
    return [[ClassName alloc] init];                           \
}                                                              \
                                                               \
+ (id)getID                                                    \
{                                                              \
    return ID;                                                 \
}                                                              \
                                                               \
@end

xyz.h

DECLARE_RS232_NEWMSG(RS232MsgGetEventDescriptions,RM_GET_EVENT_DESCRIPTIONS);

xyz.m

DEFINE_RS232_NEWMSG_IMPLEMENTATION(RS232MsgGetEventDescriptions,RM_GET_EVENT_DESCRIPTIONS);

Хотя объявление FromMsg выглядит несколько хитроумным (ivar будет просачиваться, а аргумент pMsg отсутствует.не используется; вы будете вызывать метод с именем pMsg независимо от значения аргумента с тем же именем), и вы, вероятно, не захотите использовать тип 'id' в getID, так как 'id' является нетипизированным объектом вObjective-C, так что указатель в терминах реализации.Вы, вероятно, хотите вернуть целочисленный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...