2012-11-13 33 views
0

「程序9.1」中由Kochan編寫的「objective-c中的程序」的複製粘貼代碼。但它不編譯。錯誤:從不兼容類型分配void

有兩個類:Fraction和Complex。 Complex的對象似乎工作正常,但「main.m」中的Fraction的對象「fracResult」給出了一個錯誤:「從不兼容的類型'void'分配給」Fraction *「。

這裏是Fraction.h:

#import <Foundation/Foundation.h> 
// Define the Fraction class 
@interface Fraction : NSObject 
{ 
int numerator; 
int denominator; 
} 
@property int numerator, denominator; 
-(void) print; 
-(void) setTo: (int) n over: (int) d; 
-(double) convertToNum; 
-(void) add: (Fraction *) f; 
-(void) reduce; 
@end 

Fraction.m文件:

#import "Fraction.h" 
@implementation Fraction 
@synthesize numerator, denominator; 
-(void) print 
{ 
NSLog (@"%i/%i", numerator, denominator); 
} 
-(double) convertToNum 
{ 
if (denominator != 0) 
return (double) numerator/denominator; 
else 
return NAN; 
} 
-(void) setTo: (int) n over: (int) d 
{ 
numerator = n; 
denominator = d; 
} 
// add a Fraction to the receiver 
-(void) add: (Fraction *) f 
{ 
// To add two fractions: 
// a/b + c/d = ((a*d) + (b*c))/(b * d) 
numerator = numerator * f.denominator + denominator * f.numerator; 
denominator = denominator * f.denominator; 
} 
-(void) reduce 
{ 
int u = numerator; 
int v = denominator; 
int temp; 
while (v != 0) { 
temp = u % v; 
u = v; 
v = temp; 
} 
numerator /= u; 
denominator /= u; 
} 
@end 

main.m文件:

#import "Fraction.h" 
#import "Complex.h" 
int main (int argc, char *argv[]) 
{ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
Fraction *f1 = [[Fraction alloc] init]; 
Fraction *f2 = [[Fraction alloc] init]; 
Fraction *fracResult; 
Complex *c1 = [[Complex alloc] init]; 
Complex *c2 = [[Complex alloc] init]; 
Complex *compResult; 
[f1 setTo: 1 over: 10]; 
[f2 setTo: 2 over: 15]; 
[c1 setReal: 18.0 andImaginary: 2.5]; 
[c2 setReal: -5.0 andImaginary: 3.2]; 
// add and print 2 complex numbers 
[c1 print]; NSLog (@" +"); [c2 print]; 
NSLog (@"---------"); 
compResult = [c1 add: c2]; 
[compResult print]; 
NSLog (@"\n"); 
[c1 release]; 
[c2 release]; 
[compResult release]; 
// add and print 2 fractions 
[f1 print]; NSLog (@" +"); [f2 print]; 
NSLog (@"----"); 
fracResult= [f1 add: f2]; //this line gives an error 
[fracResult print]; 
[f1 release]; 
[f2 release]; 
[fracResult release]; 
[pool drain]; 
return 0; 
} 

就此專題研究,我發現了通常,這種錯誤使用指針引起的錯誤類型。有人建議,簡單地從方法「add:」的聲明和實施中刪除星號。但是,這導致了更多的「語義問題」

此外,由於本書中使用的字符和xcode使用的字符不同,有時書中的代碼無法編譯。通常,短劃線是不同的。但是這也沒有解決「不兼容型」的問題。

歡迎任何建議或建議。

回答

2

問題是,因爲它增加了傳遞到當前對象到對象本身的Fraction* fadd被定義爲

-(void) add: (Fraction *) f; 

。這意味着它不會返回一個新的分數,它是兩個分量的總和,但它會修改分數本身。這就是爲什麼返回類型是(void),否則它會是-(Fraction*) add:(Fraction*)f;

所以

Fraction *fractResult = [f1 add:f2] 

試圖以存儲[Fraction add:]返回值,但返回值是void,這是一種非數值,不能存儲在任何地方。 (這就是爲什麼你在不兼容的類型爲void分配)

+0

更正了它。謝謝。 –

0

該類方法不正確定義:

-(void) add: (Fraction *) f; 

所以你分配一個voidFraction *有:

fracResult= [f1 add: f2]; 

糾正聲明和實施,它應該正常工作。

相關問題