2013-07-29 3 views
1

Я пытаюсь написать функцию, которая принимает переменное число параметров. Мое исследование побудило меня узнать о va_list и его методах (va_start, va_end, va_arg). Проблема в том, что параметры, которые я передаю в эту функцию, являются ссылками на объекты, созданные вне функции.Переменный список параметров в вызове функции

myClass obj1, obj2, obj3; 
modifyObjects(3, obj1, 55, obj2, 33, obj, 35) 

Вот реализация я попробовал:

void modifyObjects(int numObjects, ...) 
{ 
    va_list; 
    va_start(list, numObjects); 
    int i; 
    for(i=0;i<numObjects;++i) 
    { 
    myClass* tempObjectHandle = va_arg(list, &myClass); //get the reference to the object (THIS DOES NOT WORK!) 
    int size = va_arg(list, int); //get the size 
    tempObjectHandle->set(size); //tempObjectHandle should be pointing to object defined outside the function to set its size 
    } 
    va_end(list); 
} 

Есть ли способ для создания объектов и передать переменный список ссылок на те объекты, в функцию, так что, как только функция возвращает, все объекты были изменены?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Я также ограничен в стандарт C++ 03, что это то, что поддерживается ARM компилятором.

Спасибо!

+0

Любая конкретная причина, по которой вы не можете использовать std :: vector &? – manasij7479

+1

Поддерживает ли ваш компилятор поддержку на C++ 11? Какова конкретная проблема, которую вы пытаетесь решить, а не проблема, с которой вы столкнулись после того, как выбрали решение? (проблема не в вызове функции: проблема в том, что вызов функции должен решить) – Yakk

+0

@ manasij7479: Ссылка на вектор не совпадает с вектором ссылок (что невозможно). – Beta

ответ

1
myClass* tempObjectHandle = va_arg(list, &myClass); 

Это должно быть myClass* tempObjectHandle = va_arg(list, myClass*);

Вы продолжаете говорить, что вы передаете ссылки на modifyObjects. На самом деле, вы передаете указатели.

+0

Моя ошибка. Я хотел написать: «modifyObjects (3, obj1, 55, obj2, 33, obj, 35); как вызов функции. Это работает! – radensb

+1

Вы не можете передавать параметры в вариационную функцию по ссылке - только по значению (с помощью которого делается копия) или указателем. Передача по значению может победить вашу цель: 'modifyObjects' не сможет реально изменять объекты таким образом, чтобы вызывающий мог наблюдать. –

+0

Понял. Я получил его работу, как мне было нужно с вашим исправлением выше, и теперь я знаю правильный способ сделать это на C++ 03. Потрясающие! Еще раз спасибо! – radensb

Смежные вопросы