Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Cсылки на объекты в функции с не заданным типом переменных

2.5K
05 декабря 2002 года
vinivor
4 / / 05.12.2002
Как правильно передавать ссылки на объекты в функции с не заданным типом
переменных и возможно ли это?

Для общего случая я это представляю себе примерно так:

void LibHandler(DWORD dwCode, ...)
{
va_list uk_arg;
va_start(uk_arg, dwCode);
...

switch(dwCode)
{
case LH_INIT:
....
int& nRes = va_arg(uk_arg, int);
....
nRes = 55;
/*Как эти 55 заставить присвоиться исходному объекту?*/
...
break;
}
va_end(uk_arg);
}


// Где то в коде
int nRes = -1;
LibHandler(LH_INIT, nRes);
380
05 декабря 2002 года
Arestov
285 / / 20.09.2000
Цитата:
Originally posted by vinivor
Как правильно передавать ссылки на объекты в функции с не заданным типом
переменных и возможно ли это?

Для общего случая я это представляю себе примерно так:

void LibHandler(DWORD dwCode, ...)
{
va_list uk_arg;
va_start(uk_arg, dwCode);
...

switch(dwCode)
{
case LH_INIT:
....
int& nRes = va_arg(uk_arg, int);
....
nRes = 55;
/*Как эти 55 заставить присвоиться исходному объекту?*/
...
break;
}
va_end(uk_arg);
}


// Где то в коде
int nRes = -1;
LibHandler(LH_INIT, nRes);



1. Если тебе надо передавать произвольное число аргументов ф-ции LibHandler, то есть где-то в коде писать:
LibHandler(LH_INIT, nRes);
LibHandler(LH_XXX, p1, p2, p3);
LibHandler(LH_YYY, p1, p2);

то делай как делал но чтобы вернуть значения в переданных аргументах, передавай их как указатели:

LibHandler(LH_INIT, &nRes);

тогда:
.....

case LH_INIT:
....
int *pnRes = va_arg(uk_arg, int*);
*pnRes = 55;
....
break;
....

2. Если у тебя будет тока один аргумент, то есть
LibHandler(LH_INIT, a);
LibHandler(LH_XXX, b);
LibHandler(LH_YYY, c);

то можно написать так:
void LibHandler(DWORD dwCode, void *p)
{
switch(dwCode)
{
case LH_INIT:
*((int *)p) = 55;
break;
....
default:
break;
}
....
}

передавать надо по прежнему указатели:

LibHandler(LH_INIT, &nRes);



удачи

2.5K
06 декабря 2002 года
vinivor
4 / / 05.12.2002
Весь косяк в том, что при таком подходе пользователю функции приходиться явно
передавать указатель на объект, а хотелось бы этого избежать, примерно как
это делается со ссылками в функцию:

MyFun(int& nTest);

....
int nNumber;

MyFun(nNumber); // Нет явного указания, что передается адрес а не сам объект.

Вот как сделать это для переменного состава параметров функции?

Да, кстати, я не раз встречал в литературе, что не рекомендуется использовать
твой второй метод для собственных классов,
потому что не все наши "изящные" решения переживают преобразование указателей
class->void->class, а вот почему - я так и не нашел объяснений.
380
06 декабря 2002 года
Arestov
285 / / 20.09.2000
Цитата:
Originally posted by vinivor
Весь косяк в том, что при таком подходе пользователю функции приходиться явно
передавать указатель на объект, а хотелось бы этого избежать, примерно как
это делается со ссылками в функцию:

MyFun(int& nTest);

....
int nNumber;

MyFun(nNumber); // Нет явного указания, что передается адрес а не сам объект.



здесь передаёться тоже указатель, просто запись другая, тебе именно принципиален способ записи?

Цитата:

Да, кстати, я не раз встречал в литературе, что не рекомендуется использовать
твой второй метод для собственных классов,



Можно сделать отдельный, абстрактный класс который, передавать, и этот класс будет использоваться твоей, ф-цией.

Цитата:

потому что не все наши "изящные" решения
переживают преобразование указателей
class->void->class, а вот почему - я так и не нашел объяснений.



траблы возникают при пребразовании:
class A {
int a;
void f1();
};

class B {
int b;
void f2();
};


struct C : A, B {
int c;
void f3();
};

C obj;

тут (void*)&obj равнозначно (void*)(A*)&obj;, а вот (void*)&obj НЕ РАВЕН (void*)(B*)&obj;

тему можно развить, но при правильном и аккуратном использование проблем быть не должно.

2.5K
08 декабря 2002 года
vinivor
4 / / 05.12.2002
Цитата:
Originally posted by Arestov

здесь передаёться тоже указатель, просто запись другая, тебе именно принципиален способ записи?



Да, чтобы в пользовательском коде не сияли символы '&'.

380
09 декабря 2002 года
Arestov
285 / / 20.09.2000
Цитата:
Originally posted by vinivor

Да, чтобы в пользовательском коде не сияли символы '&'.



имхо этого сделать для ф-ции с произвольным числом параметров нельзя.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог