2012-04-03 2 views
0

クラスメソッドpopOperandOffStack:からstoredValueプロパティにアクセスしたいが、エラーが発生する。 storedValueにアクセスすることができないことは、クラスメソッドなので、私はそれを読む。誰でも私にstoredValueにアクセスするにはどうすればいいですか、storedValueをどうすればグローバルにしてpopOperandOffStack:に使うことができますか?Xcodeのクラスメソッドからプロパティにアクセスする方法がわからない

は、ここに私のヘッダーです:

#import <Foundation/Foundation.h> 

@interface CalculatorBrain : NSObject 

- (void)pushOperand:(double)operand; // - = instance method 
- (double)performOperation: (NSString *)operation; 

@property (nonatomic,readonly) id program; 

+ (double)runProgram:(id)program; // + = class method 
+ (NSString *)descriptionOfProgram:(id)program; 
@end 

そして、これは私メートルファイルです:

#import "CalculatorBrain.h" 

@interface CalculatorBrain() 
@property (nonatomic,strong) NSMutableArray *programStack; 
@property (nonatomic) double storedValue; 
@end 

@implementation CalculatorBrain 

@synthesize programStack = _programStack; 
@synthesize storedValue = _storedValue; 

- (NSMutableArray *)programStack 
{ 
    if (_programStack == nil) 
     _programStack = [[NSMutableArray alloc] init]; 

    return _programStack; 
} 

- (void)setOperandStack:(NSMutableArray *)programStack 
{ 
    _programStack = programStack; 
} 

- (void)pushOperand:(double)operand 
{ 
    [self.programStack addObject:[NSNumber numberWithDouble:operand]]; 
} 

- (double)performOperation: (NSString *)operation 
{ 
    [self.programStack addObject:operation]; 
    return [[self class] runProgram:self.program]; 
} 

- (id)program 
{ 
    return [self.programStack copy]; 
} 

+ (NSString *)descriptionOfProgram:(id)program 
{ 
    return @"Implement this in Assignment 2"; 
} 

+ (double) popOperandOffStack:(NSMutableArray *)stack 
{ 
    double result = 0; 

    id topOfStack = [stack lastObject]; 
    if (topOfStack) 
     [stack removeLastObject]; 

    if ([topOfStack isKindOfClass:[NSNumber class]]) 
    { 
     result = [topOfStack doubleValue]; 
    } 
    else if ([topOfStack isKindOfClass:[NSString class]]) 
    { 
     NSString *operation = topOfStack; 
     if ([operation isEqualToString:@"+"]){ 
      result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"-"]){ 
      result = -[self popOperandOffStack:stack] + [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"*"]){ 
      result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"/"]){ 
      double divide = [self popOperandOffStack:stack]; 
      if(divide){ 
       result = [self popOperandOffStack:stack]/divide; 
      } else { 
       result = 0; 
      } 
     } else if ([operation isEqualToString:@"1/x"]){ 
      result = 1/[self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"sqrt"]){ 
      double sqrtNumber = [self popOperandOffStack:stack]; 
      if (sqrtNumber > 0){ 
       result = sqrt(sqrtNumber); 
      } else { 
       result = 0; 
      } 
     } else if ([operation isEqualToString:@"sin"]){ 
      result = sin([self popOperandOffStack:stack]); 
     } else if ([operation isEqualToString:@"cos"]){ 
      result = cos([self popOperandOffStack:stack]); 
     } else if ([operation isEqualToString:@"MS"]){ 
      self.storedValue = [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"MR"]){ 
      result = self.storedValue; //error here 
     } else if ([operation isEqualToString:@"MC"]){ 
      result = [self popOperandOffStack:stack]; 
      self.storedValue = 0; //error here 
     } else if ([operation isEqualToString:@"M+"]){ 
      result = [self popOperandOffStack:stack]; 
      self.storedValue = self.storedValue + result; //error here 
     } else if ([operation isEqualToString:@"M-"]){ 
      result = [self popOperandOffStack:stack]; 
      self.storedValue = self.storedValue - result; //error here 
     } else if ([operation isEqualToString:@"C"]){ 
      result = 0; 
      while ([self popOperandOffStack:stack]) 
      { 
       //clear operands until returns NO 
      } 
     } else if ([operation isEqualToString:@"CE"]){ 
      result = 0; 
      self.storedValue = 0; //error here 
      while ([self popOperandOffStack:stack]) 
      { 
       //clear operands until returns NO 
      } 
     } 

     if (![operation isEqualToString:@"MS"] && ![operation isEqualToString:@"CE"]) 
     { 
      return result; 
     } else { 
      return self.storedValue; 
     } 
    } 
    return result; 
} 

+ (double)runProgram:(id)program 
{ 
    NSMutableArray *stack; 
    if ([program isKindOfClass:[NSArray class]]) { 
     stack = [program mutableCopy]; 
    } 
    return [self popOperandOffStack:stack]; 
} 

@end 

私はself.storedValueを使用することはできません。 +(静的メソッド)を-(インスタンスメソッド)に変更する以外に、どうすればよいですか(これは許可されていません)。

+0

宿題?もしそうなら、そのようなタグを付けてください。それはスタンフォードクラスとよく似ているからです。 –

+0

あなたは、クラスメソッドからインスタンスメソッドに変更することは許されていないと言います。どうして?これは、問題に近づく最も合理的な方法であり、シングルトンオブジェクトの作成と組み合わせることも可能です。 –

+0

私はスタンフォードCS193Pのコースにオンラインで従っています。私は割り当てをやろうとしています。私はスタックしてしまいました。メモリの値をどこかに保存する必要があります.2番目のアライメントのために、popOperandOffStackを変更できません。 storedValueを格納するための倍精度浮動小数点型...と私はgetterで何かをしたいとセッターはこれは可能ですか? –

答えて

0

CalculatorBrainのインスタンスであるオブジェクトを持たないため、クラスメソッド内からインスタンスゲッター/セッターメソッドを使用することはできません。 (私はそのコースを使用していませんが、クラスとオブジェクトの違いを説明することを願っています)

オブジェクト指向プログラムを作成するという観点からは好ましくありませんが、は、静的変数を使用してダブルを保持します。例を見るには、 "external static"というフレーズのC言語リファレンスを見てください。

関連する問題