получить ошибку в Objective C - PullRequest
0 голосов
/ 19 мая 2011

Я получаю ошибку в следующем коде.Я не мог догадаться, какую ошибку я совершил, чтобы появилась такая ошибка.

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»

Ответы [ 3 ]

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

Поместите объявление iVar в блок @interface класса. В вашем коде st это просто локальная переменная в методе init:

@interface RS232MsgRequestSession : NSObject{
...
@public
struct RMH_REQUEST_SESSION_MSG st;
}
...
@end
1 голос
/ 19 мая 2011

Вы определяете st как локальную переменную в функции init.

Перемещение struct RMH_REQUEST_SESSION_MSG st; к определению класса в RS232MsgRequestSession.h

1 голос
/ 19 мая 2011

То, что вы забыли сделать, это включить 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 является очень плохой идеей - обычно. Это нарушает инкапсуляцию и открывает ящик потенциальных проблем, которых у вас не было бы, если бы вы использовали правильную инкапсуляцию.

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