2013-02-18 3 views
1

В книге, которую я читаю, он объясняет, как создавать категории в основном файле, но я пытаюсь выяснить, как это сделать в отдельных файлах.Как создать категории в отдельных файлах .h и .m?

Я хочу создать для класса фракций, называемого «MathOperations», поэтому я открыл новые .h и .m, называемые Fraction + MathOperations, так как я знаю, что это соглашение.

Это Fraction.h

#import "Fraction.h" 

@interface Fraction : NSObject 

@property int numerator, denumerator; 

-(void) print: (BOOL) test; 
-(void) setTo: (int) n over: (int) d; 
-(void) reduce; 
-(double) convertToNum; 
-(id) addFrac:(id)f; 
-(void) justPrint; 
-(id) initWith:(int)n over:(int)f; 
+(Fraction *) allocF; 
+(int) count; 
+(int) gCounter; 

@end 

Фракция + MathOperations.h

#import "Fraction.h" 

@interface Fraction (MathOperations) 

-(Fraction *) add: (Fraction *) f; 
-(Fraction *) substract: (Fraction *) f; 
-(Fraction *) multiply: (Fraction *) f; 
-(Fraction *) divide: (Fraction *) f; 

@end 

Фракция + MathOperations.m

#import "Fraction.h" 

@implementation Fraction (MathOperations) 

-(Fraction *)add:(Fraction *)f 
{ 
    extern int gCounter; 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = numerator * f.denumerator + denumerator * f.numerator; 
    result.denumerator = denumerator * f.denumerator; 
    [result reduce]; 
    ++gCounter; 
    return result; 

} 


-(Fraction *)substract:(Fraction *)f 
{ 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = numerator * f.denumerator - denumerator * f.numerator; 
    result.denumerator = denumerator * f.denumerator; 
    //[result reduce]; 
    return result; 
} 


-(Fraction *)multiply:(Fraction *)f 
{ 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = numerator * f.numerator; 
    result.denumerator = denumerator * f.denumerator; 
    //[result reduce]; 
    return result; 
} 

-(Fraction *)divide:(Fraction *)f 
{ 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = numerator * f.denumerator; 
    result.denumerator = denumerator * f.numerator; 
    //[result reduce]; 
    return result; 
} 

@end 

Очевидно, я объявляю что-то неправильно причина им получить куча ошибок, которые переменные не объявлены. Кроме того, разумнее ли объявлять новый интерфейс и реализация в исходном классе фракций?

ошибки:

В классе Фракцию у меня есть некоторое свойство, называемое «числитель» и «знаменатель», они, похоже, не будет объявлять в файле реализации мет TNX

+2

Общая идея кажется правильной, пожалуйста, добавить к вопросу, какие точные ошибки, для которых переменных вы получаете? – coverback

+0

Ваш код выглядит нормально, поэтому, пожалуйста, разместите код, который включает эти файлы и использует их. – trojanfoe

+0

Можете ли вы рассказать об ошибках? Какие из них не объявлены? Как они используются в этой категории? – WDUK

ответ

1

Ваш код почти правильный, за исключением нескольких ошибок.

Найти исправленный, как и заменить в файле

// 
// Fraction+MathOperations.m 
// prog3 
// 
// Created by niroohayon on 18/02/13. 
// Copyright (c) 2013 niroohayon . All rights reserved. 
// 

#import "Fraction.h" 

@implementation Fraction (MathOperations) 

-(Fraction *)add:(Fraction *)f 
{ 
    //extern int gCounter; 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = self.numerator * f.denumerator + self.denumerator * f.numerator; 
    result.denumerator = self.denumerator * f.denumerator; 
    [result reduce]; 
    // ++gCounter; 
    return result; 

} 


-(Fraction *)substract:(Fraction *)f 
{ 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = self.numerator * f.denumerator - self.denumerator * f.numerator; 
    result.denumerator = self.denumerator * f.denumerator; 
    //[result reduce]; 
    return result; 
} 


-(Fraction *)multiply:(Fraction *)f 
{ 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = self.numerator * f.numerator; 
    result.denumerator = self.denumerator * f.denumerator; 
    //[result reduce]; 
    return result; 
} 

-(Fraction *)divide:(Fraction *)f 
{ 
    Fraction *result = [[Fraction alloc] init]; 

    result.numerator = self.numerator * f.denumerator; 
    result.denumerator = self.denumerator * f.numerator; 
    //[result reduce]; 
    return result; 
} 

@end 
+0

Это то, что я получаю сейчас http://d.pr/i/F11T – MNY

+0

@AKV, это устранило ошибки, но теперь у меня это есть в Fraction + MathOperations.h http://d.pr/i/F11T – MNY

+0

@Nir Это ** не ** ответ, поэтому отмените его, чтобы решить новые проблемы, с которыми вы сталкиваетесь. – trojanfoe

1

Я думаю, что просто это изменить:

#import "Fraction.h" 

к этому:

#import "Fraction+MathOperations.h" 

в Fraction+MathOperations.m сделает трюк.

+0

Это может объяснить некоторые проблемы определения метода, но не для свойств основных классов. – coverback

+0

@coverback Я думаю, что, возможно, здесь происходит более одной простой ошибки. – trojanfoe

3

Вы должны использовать префикс self., например self.numerator для каждого из свойств основного класса. Категория не имеет «внутреннего» доступа к свойствам, она ведет себя как любой внешний пользователь.

+0

+1 Согласен; это обязательно * * погрешность. Поскольку он использует «объявить свойство без объявления переменной экземпляра», он должен ссылаться на те свойства, что и внутри реализации «Фракция». Эти ярлыки редко экономят время ИМХО. – trojanfoe

+0

Спасибо! является общим для создания таких категорий в отдельных файлах, я должен делать это в исходных файлах фракций? @trojanfoe – MNY

+0

@Nir Да, так оно и делается. – trojanfoe

Смежные вопросы