передача статической переменной в качестве аргумента-> Цель C - PullRequest
1 голос
/ 06 мая 2011
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 ]

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

В 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 голос
/ 06 мая 2011

Во-первых, объявление статического int в вашем файле реализации волшебным образом не делает его членом класса A; Ваш класс ObjC A не имеет переменных-членов.

Во-вторых, ab-> a - это не то, как вы обращаетесь к члену класса в ObjC. Если у вас есть член, напишите метод получения для a и используйте вызов метода для доступа к нему. (Или, если вы действительно хотите, чтобы он был статическим, не добавляйте член, а просто добавьте метод получения, который возвращает статическую переменную.)

0 голосов
/ 06 мая 2011

Если вы хотите сделать ab.a, вам нужно объявить @property в Ah и @synthesize или getter и setter для a в Am

Пример Ah:

@interface A : NSObject {
}

@property int a;

Am:

@implementation A

-(int) a { return a; }
-(void) setA: (int) s { a = s; }

Редактировать: Если вы не хотите использовать установщик, используйте @property (только для чтения) int a;

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