我在以下代码中收到错误消息。我无法猜出我为这样的错误做了什么错误。
remote.h
struct RMH_REQUEST_SESSION_MSG //Message Data
{
int uDeviceID;
int uProtocolVersion;
int uReserved[5];
};
RS232MsgRequestSession.m
@implementation RS232MsgRequestSession
-(id)init
{
if (self = [super init]) {
struct RMH_REQUEST_SESSION_MSG st;
}
return self;
}
@end
xyz.h
#import "RS232MsgRequestSession.h"
@implementation xyz
-(void)Open{
RS232MsgRequestSession* pMsg = [[RS232MsgRequestSession alloc]init];
pMsg->st.uProtocolVersion = RS232_VERSION; //error
pMsg->st.uDeviceID = RS232_PROTOCOL_DEVICE_ID; //error
memset(pMsg->st.uReserved,0x00,sizeof(pMsg->st.uReserved)); //error
}
@end
错误:'struct RS232MsgRequestSession'没有名为'st'的成员
答案 0 :(得分:2)
将iVar声明放在类的@interface块中。在你的代码中,st只是init方法中的一个局部变量:
@interface RS232MsgRequestSession : NSObject{
...
@public
struct RMH_REQUEST_SESSION_MSG st;
}
...
@end
答案 1 :(得分:1)
您忘记做的是将struct
作为公共实例变量包含在@interface
中:
@interface RMH2532MsgRequestSession : NSObject {
@public
struct RMH_REQUEST_SESSION_MSG st;
}
- (void) Open;
@end
您的@implementation
应为空:
@implementation RS232MsgRequestSession
@end
PS - 您必须在此使用@public
的原因是因为在xyz
中,您使用成员运算符->
直接取消引用该对象。使用Objective-C对象时,默认情况下不允许这样做。但是,如果实例变量属于@public
属性,那么执行此操作就不会有任何问题。
正如您现在可能已经猜到的那样,使用@public
通常是非常糟糕的想法。它破坏了封装并打开了潘多拉的一系列潜在问题,如果你使用了适当的封装,你将无法拥有这些问题。
答案 2 :(得分:1)
您在init函数中将st定义为局部变量。
将struct RMH_REQUEST_SESSION_MSG st;
移至RS232MsgRequestSession.h中的类定义