почему мой целевой метод c выдает «ошибку: невозможно использовать объект в качестве параметра метода» - PullRequest
1 голос
/ 22 мая 2009

Я смотрел на это снова и снова, и я не вижу проблемы. Наверное, это очевидно, и я, наверное, идиот, и заранее прошу прощения за это.

В моем интерфейсе у меня есть:

@interface PolygonShape : NSObject 
{
    int numberOfSides;
    int minimumNumberOfSides;
    int maximumNumberOfSides;

}

@property int numberOfSides, minimumNumberOfSides, maximumNumberOfSides;

// class methods
+ (float)getAngleInDegrees:(PolygonShape *) polyshape;
+ (float)getAngleInRadians:(PolygonShape *) polyshape;
+ (NSString)getName:(PolygonShape *) polyshape;

//instance methods
- (id)init;
- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min 
       maximumNumberOfSides:(int)max;
@end

Часть реализации, в которой я получаю ошибки, относится к методу getName:

@implentation...

+ (NSString)getName:(PolygonShape *) polyshape
{
// here is where I get the "error: can not use an object as parameter to a method"
    int sides = [polyshape numberOfSides];
    NSString * s = [NSString init];

    switch (sides) {
        case 3:
            s = "@Triangle";
// there's also an "assignment from incompatible pointer type" warning...but its secondary
            break;
        case 4:
            return "@Square";
            break;

        default:
            break;
    }
}

То, что сводит меня с ума, так это то, что методы класса работают просто отлично:

+ (float)getAngleInDegrees:(PolygonShape *) polyshape;
+ (float)getAngleInRadians:(PolygonShape *) polyshape;

Ответы [ 3 ]

4 голосов
/ 22 мая 2009

Ваш метод getName: должен возвращать (NSString *), а не (NSString). Я предполагаю, что это ошибка; если да, то да, сообщение об ошибке могло бы быть более информативным.

Фактически, в Objective-C вы никогда не увидите, чтобы объекты передавались без их * позади них, а не как возвращаемых значений, не как параметров, не как локальных переменных и не как переменных-членов.

Кстати, вы упоминаете предупреждение, потому что у вас есть опечатка, смешивающая "@foo" с @ "foo". Последний - строковый литерал Objectice-C, первый - строковый литерал C, первым символом которого является @.

3 голосов
/ 22 мая 2009

В дополнение к другим ответам вы используете [NSString init], где вы должны использовать [[NSString alloc] init]. Тем не менее, это будет выделять только пустую строку, так что вам, вероятно, лучше инициализировать s либо @"", либо nil.

1 голос
/ 22 мая 2009

Я думаю, что в этом случае ошибка немного вводит в заблуждение. В Objective-C, как правило, невозможно передать объект по значению (включая возвращаемые значения). В этом случае вы объявляете возвращаемое значение как NSString, а не NSString*. Декларация должна быть:

+ (NSString*)getName:(PolygonShape *) polyshape

не

+ (NSString)getName:(PolygonShape *) polyshape
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...