Ошибки компиляции gcc в базовом примере программы objc - PullRequest
1 голос
/ 13 апреля 2011

Привет всем, я новичок в программировании и прохожу целевую книгу, чтобы выучить язык и основы программирования. Я неоднократно просматривал код, возвращался к примеру с книгой и пытался понять ошибки gcc complete. Вот мой код:

#import <stdio.h>
#import <objc/Object.h>

@interface Point: Object
    {
        int xaxis;
        int yaxis;
    }

    -(void) print;
    -(void) setx:   (int)x;
    -(void) sety:   (int)y;

@end

@implementation Point;

    -(void) print
        {
            printf("(%i,%i)", xaxis, yaxis);
        }

    -(void) setx:   (int) x
        {
            xaxis = x;
        }

    -(void) sety:   (int) y
        {
            yaxis = y;
        }
@end

int main (int argc, char *argv[])
    {
        Point *myPoint;

        myPoint = [Point alloc];

        myPoint = [myPoint init];

        [myPoint setx: 4];
        [myPoint sety: 5];

        printf("The coordinates are: ");
            [myPoint print];
        printf("\n");

        [myPoint free];

        return 0;

    }

Тогда ошибки компиляции из gcc выглядят так:

urban:Desktop alex$ gcc point.m -o point -l objc
point.m: In function ‘main’:
point.m:38: warning: ‘Point’ may not respond to ‘+alloc’
point.m:38: warning: (Messages without a matching method signature
point.m:38: warning: will be assumed to return ‘id’ and accept
point.m:38: warning: ‘...’ as arguments.)
point.m:40: error: ‘mypoint’ undeclared (first use in this function)
point.m:40: error: (Each undeclared identifier is reported only once
point.m:40: error: for each function it appears in.)
point.m:49: warning: ‘Point’ may not respond to ‘-free’

Куда я иду не так?

Кстати, я прохожу «Программирование в Objective-C» Стивена Кочана, если вы хотите знать.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Сначала базовый класс должен быть NSObject, а не Object

нормальный способ инициализации - написать alloc и init в одном и том же операторе. Обычно у вас есть - (id) init; метод в вашем классе:

-(id)init
{
  if ( ( self = [super init] ) )
  {
    ; // additional initialization goes here
  }
  return self;
}

и

int main (int argc, char *argv[])
    {
        Point *myPoint = [[Point alloc] init];

Свойства лучше использовать, тогда вы получите автоматически и сгенерированный метод установки

вместо

@interface Point: Object
    {
        int xaxis;
        int yaxis;
    }

запись

@interface Point : NSObject
{
}

@property int xaxis;
@property int yaxis;

тогда при назначении вы можете написать

[myPoint setXaxis:4]

или

myPoint.xaxis = 4;

когда вы выпускаете объект write release, не бесплатно

[myPoint release];

НТН

0 голосов
/ 13 апреля 2011

У вас есть предупреждения и ошибка.Похоже, что предупреждения указывают на то, что Object, который вы подклассируете, не реализует alloc, init или freeОбычно на платформе Apple вы подкласса NSObject, который реализует их, но не зная, на какой платформе вы работаете, невозможно посоветовать правильный вариант.опечатка, но это сейчас, кажется, исправлено.Это

point.m:40: error: ‘mypoint’ undeclared (first use in this function)

предполагает, что в вашем коде было mypoint, а не myPoint.

0 голосов
/ 13 апреля 2011

Вы забыли включить заголовок Foundation.h:

#import <Foundation/Foundation.h>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...