c++ code
--------
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
public:
static int a;
void set(int s)
{
a=s;
cout<<a<<endl;
}
void setData(int f)
{
cout<<"I am "<<f<<" years old!!!"<<endl;
}
};
int A::a=0;
int main()
{
A* ab=new A();
ab->set(10);
ab->setData(ab->a);
return 0;
}
我正在尝试获得相同的输出 这个等效的Objective C代码。
main.m
---------
#import <Foundation/Foundation.h>
#import "A.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
A* ab = [[A alloc]init];
[ab set:10];
[ab setData:ab.a]; //getting error when passed ab->a or ab.a as an argument
[pool drain];
return 0;
}
A.h
---
#import <Foundation/Foundation.h>
@interface A : NSObject {
}
-(void)set:(int)s;
-(void)setData:(int)f;
@end
A.m
----
#import "A.h"
@implementation A
static int a;
-(void)set:(int)s
{
a=s;
NSLog(@"%d\n",a);
}
-(void)setData:(int)f
{
NSLog(@"%d",f);
}
@end
错误:Request for member 'a' in something not a structure or union.
答案 0 :(得分:2)
Objective C中没有静态实例变量或方法。您可以使用类方法和静态文件范围变量来完成所需的操作。类方法是发送给类对象而不是实例的方法。
@interface AClass
{
}
+(int) a;
+(void) setA: (int) newValue;
@end
// A.m
static int aStorage = 0;
@implementation AClass
+(int) a
{
return aStorage;
}
+(void) setA: (int) newValue
{
aStorage = newValue;
}
@end
// To use:
int something = [AClass a];
[AClass setA: something * 2];
// Or dot syntax if you prefer
AClass.a = AClass.a * 2;
答案 1 :(得分:1)
首先,在实现文件中声明一个静态int并不会神奇地使它成为A类的成员;你的ObjC类A没有成员变量。
其次,ab-&gt; a不是你如何访问ObjC中一个类的成员。有了成员后,为a编写一个getter,并使用方法调用来访问它。 (或者,如果您确实希望它是静态的,请不要添加成员,只需添加一个返回静态变量的getter。)
答案 2 :(得分:0)
如果你想做ab.a,你需要在A.h中声明@property,并在A.m中声明@synthesize或getter和setter。
示例A.h:
@interface A : NSObject {
}
@property int a;
A.M:
@implementation A
-(int) a { return a; }
-(void) setA: (int) s { a = s; }
编辑:如果你不想要一个setter,请使用@property(readonly)int a;