错误:从不兼容类型void分配

时间:2012-11-13 18:52:33

标签: objective-c

来自“程序9.1”的Kochan的“Objective-c编程”中的exercice的复制粘贴代码。但它没有编译。

有两个类:分数和复数。 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 个答案:

答案 0 :(得分:2)

问题是add被定义为

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

因为它将传递给当前对象的Fraction* f添加到对象本身。这意味着它不会返回一个新的分数,它是两个分数的总和,但它会修改分数本身。这就是返回类型为(void)的原因,否则它将是-(Fraction*) add:(Fraction*)f;

所以

Fraction *fractResult = [f1 add:f2]

尝试存储[Fraction add:]返回的值,但返回值为void,这是一个非值,无法存储在任何位置。 (这就是为什么你得到从不兼容的类型中分配void

答案 1 :(得分:0)

此类方法未正确定义:

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

因此,您要将void分配给Fraction *,其中包含:

fracResult= [f1 add: f2];

更正声明和实施,它应该可以正常工作。