尝试实例化我自己的类时编译器错误

时间:2013-01-28 02:26:03

标签: objective-c

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

Pet.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

Pet.m

#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

Dog.h

#import "Pet.h"

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

// Getters and setters...
@end

Dog.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;
}

的main.m

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

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

3 个答案:

答案 0 :(得分:1)

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

#import "Dog.h"

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

答案 1 :(得分:1)

我注意到的一些事情:

  • 您的main.m需要导入Dog.h,而不仅仅是Pet.h,因为它专门针对Dog类。

  • Dog.h中的界面重新声明了一系列已在父类中声明的方法。您不需要这样做 - 所有类都隐式支持在父类上定义的所有方法。您决定是否需要独特的实现,但不需要在标题中说明。

  • -[Dog init]-[Pet init]均未实施。也许你想要(不完全实现的)+[Dog randomPet]方法?

答案 2 :(得分:0)

您有以下错误:

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

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

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

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

    方法

    //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创建属性。

相关问题