将静态变量作为参数传递 - >目标C.

时间:2011-05-06 12:13:27

标签: objective-c

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.

3 个答案:

答案 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;