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

Objective c 尝试实例化我自己的类时出现编译器错误,objective-c,Objective C,我试图创建一个类的实例,Dog,但编译器无法识别该类,也不会实例化它。我尝试将超类Pet中的初始值设定项复制到Dog,但没有成功。为什么我不能实例化Dog对象 宠物h 狗 狗 main.m #import <Foundation/Foundation.h> #import "Pet.h" int main(int argc, const char * argv[]) { @autoreleasepool { Dog *d = [[Dog alloc]

我试图创建一个类的实例,
Dog
,但编译器无法识别该类,也不会实例化它。我尝试将超类
Pet
中的初始值设定项复制到
Dog
,但没有成功。为什么我不能实例化
Dog
对象

宠物h

main.m

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

    @autoreleasepool
    {
        Dog *d = [[Dog alloc] init]];
    }
    return 0;
}
#导入
#进口“Pet.h”
int main(int argc,const char*argv[]
{
@自动释放池
{
狗*d=[[Dog alloc]init]];
}
返回0;
}

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

#import "Dog.h"

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

< P> >我注意到的一些事情:

  • 您的
    main.m
    需要导入
    Dog.h
    ,而不仅仅是
    Pet.h
    ,因为它特别指的是
    Dog

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

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


    • 您有以下错误:

    • 使用
      \import Dog.h

    • Dog*d=[[Dog alloc]init]]应该是
      Dog*d=[Dog alloc]init]

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

    • 除了这些答案,我还想补充几点,这些不是错误,但会增加您的cocoa编程风格和习惯:

      方法

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

      将多个接口合并到一个头文件中不是Objective-C的标准做法。有趣的是,一位苹果工程师提到,现在可以这样做,因为编译器足够聪明,不会因为在2012年的WWDC会话中在许多地方看到同一个文件而出错。哦,当然可以。这不是标准的做法,仅此而已。这样做会让人困惑。:)一旦你开始使用CoreData,你会很快厌倦导入每个实体和类别。当你编译它时会发生什么?你读过错误信息了吗?这里有很多无关的材料,这使得这个问题不太可能对其他人有帮助。解决这样一个问题的第一步是将其本地化——将代码减少到仍然存在问题的最低限度。有关这方面的一些有用信息,请参阅。因为我碰巧知道什么是无关的,所以我将对其进行大量编辑,以便将来的读者能够从中获得一些价值。我看不到
      Dog*[d[[Dog alloc]init]
      问题修订版中的任何地方,OP在此处删除的答案下方指出,缺少的
      @end
      s只是复制粘贴错误,因此我已从您的答案中删除这些项目,以保持对实际问题的关注。
      Dog*[d[[Dog alloc]init]
      位位于您编辑的
      main.m
      的一部分。我没有看到额外的括号,只是缺少赋值运算符。--就在底部附近。我看到了
      Dog*d[[Dog alloc]init]];
      ,它确实有一个我没有看到的额外括号,但在右侧,不是在
      *
      d
      之间(我在编辑问题时也漏掉了它)。我和我的同事都不知道⌘F见
      Dog*[d[[Dog alloc init]
      。如果你对我的编辑感到不满,我很抱歉。我只是想挽回这个问题,因为如果没有重点,我认为它应该得到否决票、接近票和删除——这对任何人都没有帮助。@JoshCaswell:我给出了答案,但出现了一些问题。现在我已经更新了,但duskwuff也改变了他的答案。 :(
      #import "Dog.h"
      
      //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)