2013-11-08 7 views
0

Очень поздно. Я был бы признателен, если вы можете сказать мне, что это Objective-C эквивалент C++ 's:Что эквивалентно & в ObjC?

&var1 

в ObjC. И когда я использую его в коде C++, я использую var1;

Я думаю, что это должно быть

**var1 

Или я ошибаюсь?

EDIT:

код в C++:

void getHierarchy(Vector<T*> &hierarchy) { 
    for(int i = 0; i < childs.size(); i++) { 
     childs[i]->getHierarchy(hierarchy); 
    } 
} 

код в ObjC:

-(void) getHierarchy: (NSMutableArray **) hierarchy { 
    [*hierarchy addObject:self]; 
    for (T *child in [self childs]) { 
     [child getHierarchy:*hierarchy]; 
    } 
} 
+0

'& var1' на каком языке? Если вы используете язык 'C', эквивалент' & var1' в 'Objective-C', вероятно,' & var1'. – nhgrif

+0

Objective-C - это надмножество C. Материал Pointer по-прежнему работает почти так же. – cHao

ответ

1

Там нет прямого эквивалента. То, что & из C++ указывает reference type и имеет конкретное значение для создания по существу другого имени для той же переменной и позволяет передавать объекты, подобные целым, в функции и позволяет вызываемому изменять версию вызывающего абонента напрямую.

ObjC не допускает такой точной семантики. Как правило, вы хотите вернуться к традиционному способу передачи по ссылке, который должен использовать указатель. То, как вы напишете этот метод обхода в ObjC, выглядит примерно так: вы должны передать массив, который вы создали в другом месте, и он заполнит его.

- (void)addToHierarchy:(NSMutableArray *)hierarchy 
{ 
    [hierarchy addObject:self]; 
    for (T * child in [self children]) { 
     [child addToHierarchy:hierarchy]; 
    } 
} 
+0

Итак, код, который я опубликовал, должен работать правильно? Или я должен использовать только один * не два **. –

+1

@MartiMarkov: Не совсем. Ваш метод настроен на использование указателя на указатель (два '**'), но в вашем рекурсивном случае вы разыскиваете его и, таким образом, передаете только указатель на объект, поэтому компилятор не будет как это. Вне этого он мог бы работать, но не был идиоматичным. Внешнему вызову нужно будет создать изменчивый массив, а затем передать в адрес своего указателя, что не нужно. Версия, которую я опубликовал, должна делать то же самое и, вероятно, немного чище. –

0

Эквивалент Кассиопеяне & в Objective-C по-прежнему & и имеет точно такое же поведение ,

1

Один пример стоит тысячи слов ...

NSError *error = nil; 
NSArray *result = [moc executeFetchRequest:req error:&error]; 
if (!result && error) { 
    NSLog(@"DAO :: banks --> %@", error); 
    return nil; 
} 
Смежные вопросы