-1

我正在尝试创建一个类的实例Dog,但是编译器无法识别该类并且不会实例化它。Pet我尝试将初始化程序从超类复制到Dog中,但这并没有奏效。为什么我不能实例化Dog对象?

宠物.h

#import <Foundation/Foundation.h>

@interface Pet : NSObject
{
    // Some ivars
}

//Randomizer
+(id)randomPet;

//Initializer 
-(id)initName:(NSString *)name
initColor:(NSString *)color
initBreed:(NSString *)breed;

// Getters and setters...

@end

宠物

#import "Pet.h"

@implementation Pet

+(id)randomPet
{
   // Empty 
}

-(id)initName:(NSString *)name
    initColor:(NSString *)color
    initBreed:(NSString *)breed;
{
    self = [super init];
    if(self)
    {
        // Initialization...
    }
    return self;

}

@end

狗.h

#import "Pet.h"

@interface Dog : Pet
-(id)initName:(NSString *)name initColor:(NSString *)color
    initBreed:(NSString *)breed;

// Getters and setters...
@end

狗.m

#import "Dog.h"

@implementation Dog

+(id)RandomPet
{
    // Snip...
}

- (id)initName:(NSString *)name
        initColor:(NSString *)color
        initBreed:(NSString *)breed;
{
    self = [super init];
    if(self) {
        // Initialization...
    }
    return self;
}

主文件

#import <Foundation/Foundation.h>
#import "Pet.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool
    {
        Dog *d = [[Dog alloc] init]];
    }
    return 0;
}
4

3 回答 3

1

您没有将 Dog 导入具有 main 方法的方法中。添加:

#import "Dog.h"

宠物进口下。您可能需要考虑将所有域对象放在一个标头中。

于 2013-01-28T02:35:49.967 回答
1

我注意到的几件事:

  • main.m将需要 import Dog.h,而不仅仅是Pet.h,因为它专门指Dog类。

  • 你的接口Dog.h重新声明了一堆已经在父类中声明的方法。您不需要这样做——所有类都隐式支持父类上定义的所有方法。是否需要唯一的实现由您决定,但不需要在标题中说明。

  • 既没有-[Dog init]也没有-[Pet init]实施。也许您想要(未完全实现的)+[Dog randomPet]方法?

于 2013-01-28T02:37:50.713 回答
0

您有以下错误:

  1. 而不是#import Pet.h使用#import Dog.h

  2. Dog *d = [[Dog alloc] init]];应该Dog *d=[Dog alloc]init];

  3. 无需在子类中重新定义与在超类中相同的方法。

除了这些答案之外,我还想补充一些东西,这些不是错误,但它会增加你的可可编程风格和习惯:

方法

//Initializer 
-(id)initName:(NSString *)name
initColor:(NSString *)color
initBreed:(NSString *)breed;

不符合标准,它应该是:

//Initializer 
-(id)initName:(NSString *)name withColor:(NSString *)color withBreed:(NSString *)breed;

在以下几行中

int petId;
while(petId != 1 && petId!=2)

用 初始化petID=0;呢?如果它的垃圾值变为 1,那么它永远不会进入循环。


您可以使用@property 创建属性。

于 2013-01-28T03:01:02.803 回答