2

わかった。ここで、最良の出発点を見つけるのは難しい。LionのエラーXCode(4.3.2)は、次のとおりです。

Redefinition of 'a' with a different type

著者は、この行を宣言すると(このページの下部近く、メインで)...

OwnedAppliance *a = [[OwnedAppliance alloc] init];

...正常に動作するはずです。そうではありません。上記のエラーをキックバックします。OwnedApplianceの実装にはinitメソッドがないため、コンパイラーは階層を上って、OwnedApplianceのスーパークラスであるApplianceに移動し、そこでinitメソッドを検索することを理解しています。次の行のみを含むオーバーライドされたinitを検出します...

[self initWithProductName:@"Unknown"];

...そしてそれを実行します。了解した。

うーん。すみません、みんな。何が起こっているのかを説明しようとしました。十数行かかり、表面を引っかいただけでした。私が起こっていると思うことであなたを退屈させるのではなく、私はただ尋ねます:

このコードで何が起こっているのですか?より良い用語がないため、初期化の「パス」はどこで終了しますか?再定義(エラー)はどこで発生しますか?

/********************  Appliance.h  ********************/

#import <Foundation/Foundation.h>

@interface Appliance : NSObject
{
    NSString *productName;
    int voltage;
}

@property (copy) NSString *productName;
@property int voltage;

-(id)init;
// Designated initializer
-(id)initWithProductName:(NSString *)pn;
...
@end

/********************  Appliance.m  ********************/

#import "Appliance.h"

@implementation Appliance

@synthesize productName, voltage;

-(id)init
{
    return [self initWithProductName:@"Unknown"];
}

-(id)initWithProductName:(NSString *)pn
{
    self = [super init];

    if (self) {    
    [self setProductName: pn];
    [self setVoltage: 120];
    }

    return self;
...

@end

/********************  OwnedAppliance.h  ********************/

#import "Appliance.h"

@interface OwnedAppliance : Appliance
{
    NSMutableSet *ownerNames;
}

// Designated initializer
-(id)initWithProductName:(NSString *)pn
          firstOwnerName:(NSString *)n;
...

@end

/********************  OwnedAppliance.m  ********************/

#import "OwnedAppliance.h"

@implementation OwnedAppliance

-(id)initWithProductName:(NSString *)pn
          firstOwnerName:(NSString *)n
{
    self = [super initWithProductName:pn];

    if (self) {
        ownerNames = [[NSMutableSet alloc] init];

    if (n) {
        [ownerNames addObject:n];
        }
    }
    return self;
}

-(id)initWithProductName:(NSString *)pn
{
    return [self initWithProductName:pn
                      firstOwnerName:nil];
}
...
@end

/********************  main.m  ********************/

#import <Foundation/Foundation.h>
#import "Appliance.h"
#import "OwnedAppliance.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
    //  Previously omitted problematic code:
        Appliance *a = [[Appliance alloc] init];
        NSLog(@"a is %@", a);
        [a setProductName:@"Washing Machine"];
        [a setVoltage:240];
        NSLog(@"a is %@", a);

    //  The following line is where the error occurs:
        OwnedAppliance *a = [[OwnedAppliance alloc] init];
        ...
    }
    return 0;
}

私はこの質問とそれを尋ねる方法についてたくさん考えました。ひどく馬鹿げているとは思いません。:)しかし、私の脳はこのようなものを9時間勉強してから揚げられているので、これが完全に明白な質問であるかどうかをお詫びします。TIA

編集:main()には、実際にエラーを引き起こしていたコードが含まれるようになりました。省略されているにもかかわらず、それを捕まえるのに十分なほど良いジャックに感謝します。

4

1 に答える 1

2

aコンパイラは、変数自体が2回宣言されていることを実際に通知しています。エラーは割り当てとは何の関係もありません。他のどこか、スコープ内に、aとは異なるタイプの、という名前の別の変数がありOwnedAppliance *ます。一方(または両方)の名前を変更すると、エラーはなくなります。

于 2012-05-02T01:44:43.627 に答える