2014-05-05 65 views
0

我想在Objective-C中爲計算器類做類方法(我不想實例方法和變量),但我遇到了問題。我有以下h文件:類方法錯誤,目標C

#import <Foundation/Foundation.h> 

@interface Calc : NSObject 
{ 
NSNumber* accumulator; 
} 
//Acumulator Methods 
+ (void) setAccumulator: (NSNumber *) value; 
+ (void) clear; 
+ (NSNumber *) accumulator; 

//Arithmatic metods 
+ (void) add: (NSNumber *) value; 
+ (void) subtract: (NSNumber *) value; 
+ (void) multiply: (NSNumber *) value; 
+ (void) divide: (NSNumber *) value; 

+ (void) setCurrentOperation: (NSString *) o; 
+ (NSString *) currentOperation; 

然後,當我嘗試定義的.m文件的任一方法,收到了錯誤:「實例變量類方法‘X’訪問」。在我的.m文件,此錯誤存在的方法的一個例子:

+ (void) setAccumulator: (NSNumber *) value 
{ 
     accumulator = value; 
} 

可能有人或許可以解釋爲什麼這個錯誤發生以及幫助我​​解決這個問題?謝謝!

+0

你正在聲明'accumulator'作爲一個實例變量,這意味着它不能從類方法訪問。相反,您應該在.m文件中將其創建爲靜態變量。看到這個問題的信息如何做到這一點:http://stackoverflow.com/questions/1063229/objective-c-static-class-level-variables – smileyborg

+0

這是一個糟糕的設計選擇。你爲什麼要製作所有這些方法的類方法?它們都應該是實例方法。 – rmaddy

+1

我知道你說過你不想使用實例方法,但是使用實例方法/變量,然後創建一個(可能是全局的)Calc實例會是更好的方法。 –

回答

0

如錯誤所述,您無法訪問類方法中的實例變量,因爲實例變量屬於實例,而不屬於類。根據定義,類方法沒有鏈接到實例,因此沒有實例變量可供更改。

一般來說,類方法應該有一個存在的理由。例如,用於返回特定類的實例的工廠函數是類方法的良好候選者,因爲它與該類緊密關聯。否則,如果你有一個不需要訪問任何實例數據的方法,那麼它通常可以更好地實現爲一個獨立的函數。 Objective-C不像Java,它必須將所有東西都塞進一個類中,不管它是否屬於一個類。

0

如果您不想使用實例變量,那麼請勿嘗試使用它們 - 在這種情況下,accumulator是您嘗試使用的實例變量。如果您確實需要實例變量,請使用實例方法。

0

當我看到這樣的代碼,這讓我覺得你真的只是濫用面向對象的編程...

,你應該考慮這些對象爲不同的機器。我想你會想要更多在某個點上比一個計算器...所以你不應該使用類方法...你的數據應該包含在計算器的實例...

如果你想使用類方法,你會做的事情比如改變所有計算器的屬性,比如你可能想改變固定點計算的默認精度等等,或者使用一種乘法算法而不是另一種算法......但通常是y你真的只是用這些值初始化單個對象的屬性,而不是用類方法改變已經初始化的對象......這對封裝來說更好。