Objective C делает целое число из указателя без приведения, передавая объекты как аргументы - PullRequest
4 голосов
/ 12 апреля 2009

Я пытаюсь сделать блэкджек в цели C, и у меня проблемы с передачей предметов вокруг. Класс My Hand в основном берет колоду и вытягивает из нее карты, добавляя их в массив.

Вот методы Hand, используемые:

- (id)init : (Deck*) deck
{
    [self draw: deck];
    [self draw: deck];
    return self;
}

- (void)draw: (Deck*)deck;
{
    Card* C= [deck drawFromDeck];
    [cards addObject: C];
}

Вот проблемная часть основного:

Deck* deck=[[Deck alloc] init];
Hand* hand=[[Hand alloc] init: deck ];

Вторая строка получает ошибку «целое число из указателя без приведения». Всякий раз, когда я запускаю код, в руке никогда не бывает карт, потому что нет колоды, из которой можно взять (я думаю :)). Нужно ли проходить или анализировать колоду * по-другому? (если вам нужно, чтобы я отправил больше кода, просто спросите)

Спасибо, ребята! : D



Редактировать в отношении щедрости : Хотя я действительно считаю, что ответ, который я принял, хорошо объяснен, и этот вопрос получил в среднем более 17 просмотров в день за прошедший год с половиной. Это означает, что этот вопрос, вероятно, является первым опытом, который многие люди испытывают с помощью stackoverflow , и его улучшение не только покажет нам лучшее качество, но и, вероятно, сэкономит много времени людям. Хотя сейчас у него есть хорошие ответы, я хочу убедиться, что он настолько совершенен, насколько это возможно, особенно потому, что мы на самом деле не знаем, сколько из этих людей смогли последовать ему и решить свою проблему.

Продолжайте вносить изменения в существующие ответы или добавлять свои собственные. (Моды, как вы думаете, это будет хорошим кандидатом в вики сообщества?)

Ответы [ 3 ]

12 голосов
/ 13 апреля 2009

Проблема, основанная на дополнительном коде, который вы разместили ниже, состоит в том, что у вас есть два метода с одинаковым именем, но параметры которых не совпадают, а именно - (id)init: (Deck*)deck и - (id)init: (int)newvalue.

Обычно это не проблема, но в этом случае типы структурно различаются - указатель и int. Компилятор может различить то, что вы имеете в виду, основываясь на типе получателя, но это работает только тогда, когда он имеет статический тип. Например, если у вас было:

Hand *h = [Hand alloc];
h = [h init: deck];

Это перестало бы давать вам предупреждение. Впрочем, это очень необычный код - alloc и init почти всегда идут в одной строке.

Поскольку alloc возвращает id, а не Hand, он не знает, что вызов init в [[Hand alloc] init:deck] относится к Hand, а не Card. См. Документы Apple по статической типизации для получения дополнительной информации об этом.

Самое простое (и разумное) решение - переименовать методы, чтобы указать тип аргумента. Например, вы можете использовать initWithCardValue: и initWithDeck:.

РЕДАКТИРОВАТЬ: Кроме того, да, прислушаться к предложениям из других сообщений о правильном поведении внутри метода init. (Это не вызывает предупреждение, но может быть причиной ошибки.)

2 голосов
/ 12 апреля 2009
  1. Как сказал Фил Нэш в своем комментарии к вашему вопросу, убедитесь, что вы импортировали заголовки для рук и колод в свой основной файл. Это должно остановить предупреждение (и это было предупреждение, а не ошибка).

  2. В ваших init методах не забудьте вызвать [super init], убедиться, что он не вернул nil, и инициализировать возвращаемый объект. Наиболее распространенный способ сделать это:

    if ((self = [super init])) {
        //Initialize here
    }
    return self;
    
  3. Объявление переменных для массивов недостаточно; Вы также должны создать массивы и поместить их в переменные. Только тогда вы можете поместить вещи в массивы.

1 голос
/ 12 апреля 2009

Вы вызывали [super init] в методе init: вашей Руки?

Кроме того, вы добавляете карты в массив карт; это правильно настроено?

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